为多个重命名的两个文件创建Git补丁

Asb*_*erg 8 git patch file-rename git-patch file-move

我想将两个文件从一个存储库移动到另一个存储库.这些文件最初添加为:

  1. /src/init/Price.cs
  2. /tests/init/PriceTests.cs

这两个文件后来被重命名为:

  1. /src/init/PriceValue.cs
  2. /tests/init/PriceValueTests.cs

然后转到:

  1. /src/moved/PriceValue.cs
  2. /tests/moved/PriceValueTests.cs

我试图通过这种描述为这些文件创建一组补丁,但我不确定如何传递文件存在的六种不同路径.

我设法找到影响PriceValue.cs(跨重命名和移动)的所有提交ID ,但将这些ID传递给Git失败,并显示以下错误消息:

$ git format-patch -o /tmp/pricevaluepatches $(git log --all dfeeb 6966b 9f882 …)
-bash: /usr/local/bin/git: Argument list too long
Run Code Online (Sandbox Code Playgroud)

那么,我如何为此创建一组补丁,它只包含对所提到文件的更改,但是在一个重命名和每个文件的一次移动中包含它?

Nil*_*ner 6

您可以获取一些特定文件的补丁,但不能早于提交sha1使用

git format-patch sha1 -- file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

任何文件都可以是旧文件(在重命名之前)或现有文件.

如果你想要提交所有提交,sha1你可以使用

git format-patch --root sha1 -- file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,所有提交到HEAD你的六个文件的now():

git format-patch --root HEAD -- /src/init/Price.cs /src/init/PriceValue.cs /src/moved/PriceValue.cs /src/init/PriceTests.cs /src/init/PriceValueTests.cs /src/moved/PriceValueTests.cs
Run Code Online (Sandbox Code Playgroud)


eft*_*ft0 1

嗯......假设我想保持补丁文件的原样,我要做的就是将补丁文件应用到一个分支上,这样我就可以在正确的分支上挑选它。

因此,假设我的 master 分支上有一个名为 /tests/moved/PriceValueTests.cs 的文件,并且我想在其上应用名为 /tests/init/PriceTests.cs 的补丁。假设我不想破解补丁文件,我会做的是:

  • 从我的 master 创建一个临时分支
  • 结帐临时分支
  • 将文件重命名为补丁文件所在的相同路径(当然还要提交)
  • 在临时分支上应用补丁文件(现在文件路径有匹配的文件应该可以工作)
  • 提交到临时分支
  • 结帐大师
  • 从临时分支中挑选最后一个修订版

这样 git 就可以跟踪名称更改并能够成功应用它。我已经这样做过很多次了,而且 git 的文件重命名算法往往是正确的。