git diff除了某些标签外

时间:2017-07-13 09:40:18

标签: git

我需要获取2次提交之间的文件更改列表,但不包括具有给定标记的提交。

我目前正在使用此行

git diff --oneline --diff-filter=AM FIRST_TAG HEAD -- SpecificFolder

因为我只需要在FIRST_TAG和现在之间添加或修改(在SpecificFolder目录内)的文件的名称

现在,我需要在此比较中排除标记为EXCLUDE_TAG / *的提交。 这是由git diff支持的吗?或者我应该做几个步骤,如

  1. 在两个标记之间获取提交ID
  2. 对于每个提交ID,如果提交未标记为EXCLUDE_TAG / *
  3. ,请在SpecificFolder中获取文件名
  4. 汇总第2步中累积的清单

1 个答案:

答案 0 :(得分:1)

您将需要您的多步骤流程或类似的东西。

长描述(随意TL; DR)

"排除某些提交"是一个短语,在Git中 - 特别是应用于差异 - 没有多大意义。这就像说'#34;我想在那边,但不包括我的左臂。" : - )

从根本上说,这里的问题是:

  • 提交是某个源树的快照
  • git diff比较了两个这样的快照
    • 或一个快照和工作树
    • 或一个快照和索引
    • 或索引和工作树

(使用"索引"和"工作树"基本上充当临时快照,而不是提交,这是永久和不变的快照)。

一旦得到比较结果,您可以通过各种方式减少它,例如使用--diff-filter限制它,仅使用--name-only打印文件名(我猜你的意思是代替{ {1}}此处,和/或仅查看--oneline中的更改,但我们始终从两个特定快照开始。

同时,标记名称仅指定长链提交中的一些提交,例如:

SpecificFolder

这里,每轮 tag:v1.0 | v ...--o--o--o <-- master \ o--o--o <-- develop ^ | tag:v1.1-rc1 节点代表一个提交。在o上提交的最新提交或提示提交是您在运行master时复制以进行工作的提交。 相同的提交 - 相同的快照 - 由标记git checkout master命名,但是一旦您在v1.0上进行提交,标记就会保留它在哪里,分支名称向前移动以适应新的提交:

master

类似地,标记 tag:v1.0 | v ...--o--o--o--o <-- master \ o--o--o <-- develop ^ | tag:v1.1-rc1 标识一个特定的提交,当前一个提交&#34;后面&#34; v1.1-rc1的提示。

您可以运行develop来比较两个特定的标记提交。这个完全忽略了每个其他提交:它只提取两个快照并进行比较。

因为在这种情况下,您只是寻找添加或修改过的文件,所以一次进行一次提交是有道理的:

git diff v1.0 v1.1-rc1

您现在可以运行 tag:EXCLUDE_TAG/2 | v o--o <-- feature / ...--o--A--*--o <-- master \ \ *--* \ / \ *--* *--*--* <-- develop (HEAD) \ / *--* ^ | tag:EXCLUDE_TAG/1 ,其中git rev-list --ancestry-path A..HEAD是一个定位提交A的标识符,当前提交是分支A的提示提交,这是目前的分支。这将打印出每个已加星标的提交的哈希ID(请注意,develop的ID本身将进行打印)。

从此列表中,您可以删除完全一个已加星标的提交的哈希ID,因为它的名称为A。您可以使用EXCLUDE_TAG/1找到这些内容。 (尝试没有选项,然后添加git for-each-ref 'refs/tags/EXCLUDE_TAG/*'指令将其输出限制为你真正想要的。如果你有注释和轻量级标签的混合,请记住你可能必须&#34;剥离&#34;其中一些用于查找目标提交。--format将对注释标记执行此操作,但不为轻量级标记生成输出。)请注意,此示例中的某些类似%(*objectname)可能不在原始标记中提交哈希列表。

您现在拥有所有未排除的提交哈希值的列表。因此,您可以将任何一个提交与任何其他提交进行比较,例如将每个提交与其直接父提交进行比较,以查看在该提交中发生了哪些更改。但是这个策略存在一个缺陷:你将如何处理 merge 提交?在上图中,有一个合并提交,在EXCLUDE_TAG/2的提示后面三步。它可能与其父提交中的任何一个或两者不同 - 事实上,如果它是邪恶合并,它将包含不在中的更改父(这是邪恶合并的定义:见Evil merges in git?)。你必须自己决定如何处理这类案件。