3

根据其手册页,git cherry进行一些测试以确定是否应将提交樱桃挑选到另一个分支:

The equivalence test is based on the diff, after removing whitespace
and line numbers. git-cherry therefore detects when commits have been
"copied" by means of git-cherry-pick(1), git-am(1) or git-rebase(1).

我想创建一个脚本,通过删除只会更改某个文件的所有提交来进一步最小化精选候选列表。

例如,如果将更改文件 A、B、C 的樱桃采摘提交 1 更改到我的分支中,则只会更改文件 A,而 B 和 C 已经包含更改,我希望脚本从候选列表中删除提交。

换句话说,如果我按照 的建议挑选了一个提交git cherry,并且生成的提交只会更改文件 A,而不会更改其他文件,我想将它从我的列表中删除。

有没有一种简单的方法可以从 Git 中获取这些信息?

4

2 回答 2

1

通过删除只会更改某个文件的所有提交,进一步最小化精选候选列表

您可以使用git diff-tree -p $commit | git apply --exclude=path/to/that/file --numstat,如果列出任何更改,则提交在其他文件中有更改,但不清楚“将更改”在这里意味着什么。“会改变”,如果您再次挑选它,而不管它在该文件之外的更改是否已经应用?

做到这一点的唯一方法是对实际应用进行测试运行。您可以自动执行该检查,但您会在此处留下很多问题。 git diff-tree -p $commit | git apply --exclude=path/to/that/file -3,然后git diff --name-only查看是否有任何未决的更改,然后git reset --hard在做或不做整个樱桃采摘之前。

但是,无论后续工作是否将其还原或修改,樱桃采摘提交都可以对当前上游提示进行更改,无论它是否已经被樱桃采摘。因此,如果您不在乎是否重新应用随后恢复的更改,那么您为什么要从git cherry列表开始呢?这里有些东西没有意义。

于 2021-11-23T22:39:43.563 回答
0

(取决于你如何解释“容易”......)

git有一个patch-id命令命令,它从 diff 构建哈希,并带有一些规则(忽略行号和空格)来尝试拥有该属性:引入相同更改的两个补丁将具有相同的补丁 ID。

您可以通过以下方式使用它:

对于每个提交:

  1. 选择一种方法来生成它在文件以外的文件上生成的补丁that/file

  2. 运行那个补丁| git patch-id --stable

  3. 一旦计算了提交范围内的所有补丁 ID,就可以将它们与列表中的修剪提交进行比较

于 2021-11-24T22:05:54.790 回答