如何列出包含提交更改的所有标签?

问题描述 投票:0回答:2

假设我有 2 个标签

X
Y
这样

tag X log history: C1 C2 ... Cn
tag Y log history: Z1 Z2 ... Zm

如果

hash(Ci) = hash(Zj)
(对于给定的
i
j
)并且我想知道所有具有提交的标签
Ci
我可以这样做,如“如何列出包含提交的所有标签?”中的回答',

git tag --contains Ci

这会给我

X
Y

对于

hash(Ci) != hash(Zj)
的情况是否有可能获得相同的响应,但它们都应用相同的更改(例如,它们都在同一文件中添加相同的行,但提交消息不同)?


编辑

通过说标签“包含给定提交的更改”,我的意思是在标签的日志历史记录中,有一个提交

C
应用了与给定提交相同的修改。

git git-commit git-tag
2个回答
2
投票

不,使用标准

git
功能无法完全自动且可靠地完成此操作。即使您不编辑提交消息,在挑选时 SHA-1 也会始终发生变化。不能有 2 次提交具有相同的 SHA-1。

对跟踪的一些支持由

提供
  • git cherry-pick -x
    会将原始 SHA-1 插入到新提交的提交消息中。但如果您忘记使用
    -x
    ,“链接”就会丢失。
  • git log "-S${string}" --all
    如果您知道(足够)适合您的更改的字符串,则会在所有分支中搜索更改。
  • 使用 Git,我如何在所有分支中搜索字符串?

问题想使用标签。但标签也不会添加如此神奇的功能。

您将需要一个流程来在提交消息中进行必要的交叉引用。 CI 可以强制执行这样的流程


1
投票

我想到的一般是:

  1. 查找含义为“如果标签包含此提交,则它包含更改”的提交列表
  2. 将包含任何这些提交的所有标签组合在一起

最难的部分是确定 1.,所以首先是最简单的部分:


  • 对于第 2 点:如果您有提交列表:
# in a file, or as the output of a commit :
eacf32c
44df701
...

只需重复运行

git tag --contains
,并将结果合并在一起:

cat thelist.txt | while read sha; do git tag --contains $sha; done | sort -u

  • 第 1 点:找到提交列表

这在很大程度上取决于您打算如何实现上述更改。以下是一些例子:

  • 如果您知道只想使用

    git cherry-pick
    应用目标提交,那么提交消息很可能会非常相似:
    git log --all --grep "one discriminating sentence"
    git log --all --grep "#issuenumber"
    可能会给您一个很好的起点

  • 如果您想要定位添加或删除特定行的提交:从

    git log --all -S "a specific line"
    git log --all -G "a specific line"
    开始(如果您需要有关它们如何工作的更多说明,请阅读 -S 和 -G 的文档)。

您还可以通过运行以下命令来发现

that/specific/file.txt
that/specific/dir
的变化:

git log -S "a specific line" -- that/specific/file.txt
git log -G "a specific line" -- that/specific/dir
  • 如果你想发现向你的代码库引入了完全相同的补丁的提交,事实证明 git 有一个算法:
    git patch-id

    注意:它在
    git rebase
    中用于发现已应用于目标的提交)

在存储库的完整提交列表上使用它会有点复杂,但它可以自动化:

首先计算您想要发现的更改的补丁 ID :

$ git show A | git patch-id --stable
# this will give you a two fields output :
# a hash for the diff itself             the hash of the commit
3bbe48e8ce5714b78900653e618ff4dc41205ffb 84d48dcd44d440d3a35177c92c897d2efae93346

然后计算所有补丁 ID,并 grep 查找您想要的补丁 :

git rev-list --all | while read sha; do git show $sha | git patch-id; done
  | grep "^3bbe48e8ce5714b78900653e618ff4dc41205ffb"

第二列将是提交列表:

... | awk '{ print $2 }'

  • 而不是列出存储库中的所有提交

    git rev-list --all
    ),您可能希望使用第一个命令之一来缩小初始搜索范围:输入由
    git log --grep ...
    git log -S ...
    git log -- that/specific/dir
    生成的列表...

  • 您可以通过更改

    git show
    命令对“特定文件上的补丁”使用相同的技巧:

git show $sha -- file1 file2 dir3 | git patch-id
  • 您可以编写自己的脚本,该脚本接受提交 ID,并检查它是否包含您想要的内容

  • 等等等等......

注意:如果您有一个

git log
命令可以让您发现一些您感兴趣的提交,您可以通过删除所有格式选项(
--onelin
--graph
)将其转换为仅输出提交哈希值的命令,
--format
...) 并将其替换为
--format="%H"

© www.soinside.com 2019 - 2024. All rights reserved.