代码之家  ›  专栏  ›  技术社区  ›  Damon

在2位提交之间导出压缩文件diff/patch?

  •  0
  • Damon  · 技术社区  · 10 年前

    我遇到这段代码是为了从存储库中的特定位置导出修补程序

    git log --author=jdoe oldbranch..newbranch -p -- path/to/subdirectory > myChangesInSubdirectory.patch
    

    当然,它是通过提交而不是全部拼凑在一起的,因为补丁就是这样做的。但我想说的基本上是“以下是特定文件夹中的文件 commit a commit b 以及其中的变化”,而不需要对同一文件进行多次更改。

    我可以手动从原始标记创建一个新的repo,然后复制到另一个分支,并以这种方式进行一次提交,但我正在尝试找到一种单行CLI方式来输出它。

    1 回复  |  直到 10 年前
        1
  •  2
  •   Community CDub    8 年前

    有很多方法可以做到这一点,这取决于你想要的精确结果。

    如果您想要两个特定的、已经存在的提交之间的差异(可能也限于特定的文件/目录), git diff 将执行以下操作:

    git diff rev1 rev2
    

    或:

    git diff rev1 rev2 -- path1 path2 ... pathN
    

    如果您想要提交在特定日期范围内的更改,排除该范围之外的更改,那么这就有点复杂了。例如,考虑以下图形片段:

    ... - D - E - F - G - J - K ...
                \       /
                  H - I
    

    进一步假设提交日期 D 是“最后一个星期三”,但提交日期 E 是“两个月前”,因为承诺 E 是前向移植(重基或类似)的。同时提交 F G 是最近的 H 但是 I 也是从早期的 E J K 也是最近的,但你决定 K 最近的因此,您需要的提交 D 但不是 E ; F G ; 和 H 但不是 .

    在这种情况下,要将所有这些更改(而不是其他更改)作为一个补丁,您需要在前面创建一个新的分支 D 你可以选择(或同等的)每一个提交。你可以单独采摘,然后使用 差异比较 从“之前”生成补丁 D “”到“最终结果”。在这种情况下,仍然有一种单行(ish)的方法,因为您没有选择任何合并:

    git checkout -b deliver D^ && git cherry-pick \
        $(git rev-list --since=... --until=...) && \
    git diff D^ HEAD [-- paths]
    

    在这里,我们使用 git rev-list 选择所需的提交并将生成的SHA-1馈送到 git cherry-pick ,将它们添加到新分支( deliver )从提交开始创建 D^ 假设一切顺利并不一定是一个好的假设 差异比较 比较 D)^ ,我们的出发点 HEAD ,所有樱桃采摘后的结果。

    (如果您至少将其称为简化,则可以通过创建 传送 树枝 之后 犯罪 D 因为我们计划将其包括在内。然而,我认为 --since --until 价值观是您首先决定要包含哪些承诺的方式,因此我认为这样做会更加清晰。)

    如果您计划包含合并提交,则这一切都会失败 J 这里:合并提交可以是“邪恶的合并”(请参见 here here 详细信息),并且这些不能简单地被樱桃采摘。所以如果你 有一些需要运行的特殊要求 git rev列表 要选择包含的提交,请仔细检查。(请注意,您可以使用 --merges .)