【问题标题】:Find files that would be changed by git cherry查找将被 git cherry 更改的文件
【发布时间】:2022-01-02 06:22:48
【问题描述】:

根据其手册页,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 中获取这些信息?

【问题讨论】:

  • 您能否详细解释一下您的工作流程是什么,以及为什么挑选樱桃如此常见,您想通过脚本整体进行?
  • 上游发生冲突和恢复的可能性很难回答——如果樱桃选择已被应用并随后恢复或修改,git cherry 仍将显示为已应用了,因为它有,但上游提示不再有结果,所以再次挑选它会改变文件,这可能是你想要的,也可能不是。在这些情况下,您希望列出什么?
  • 请注意,我们假设您的意思是会被cherry-pick改变,而不是会被cherry改变,因为git cherry只是打印出提交。它从不更新任何东西。

标签: git git-cherry


【解决方案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 列表开始呢?这里有些东西没有意义。

【讨论】:

    【解决方案2】:

    (取决于你如何理解“简单”...)

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

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

    对于每个提交:

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

    2. 通过| git patch-id --stable运行该补丁

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

    【讨论】:

      猜你喜欢
      • 2018-08-25
      • 2011-08-08
      • 2019-07-25
      • 1970-01-01
      • 2011-12-02
      • 2013-10-02
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      相关资源
      最近更新 更多