2017-04-27 44 views
8

我想将两个文件从一个存储库移动到另一个。最初添加的文件为:跨几个重命名为两个文件创建Git修补程序

  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

我试图通过this description去创建一组补丁对这些文件的,但我不知道该如何传递文件存在的六个不同路径。

我设法找到了所有影响PriceValue.cs(横跨重命名和移动)提交身份证,但通过这些ID对Git的失败,出现以下错误信息:

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

那么,如何创建一个这套修补程序只包含对所提及文件的更改,但在每个文件的一个重命名和一个移动中包含它?

+0

你试过把所有的文件'ids.txt'(每行一个),并运行'猫ids.txt提交的ID | xargs git format-patch -o/tmp/pricevaluepatches'? –

+2

另外,您不必在命令中运行'git log --all ...'。一个简单的'git format-patch -o/tmp/pricevaluepatches dfeeb 6966b 9f882 ...'应该就足够了。 –

+0

@NilsWerner,感谢您的建议。不过,这只能解决一半的问题。从我的ID识别的提交,我怎么只适用影响'PriceValue.cs'和'PriceValueTests.cs'整个重命名和移动变化? –

回答

1

嗯.....假设我想保持修补程序文件的方式,我要做的是将修补程序文件应用到分支上,以便我可以在正确的分支上进行樱桃选择。

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

  • 我主人
  • 结账临时支
  • 创建一个临时党支部的文件重命名为同一路径补丁文件有(和承诺,当然)
  • 适用于临时党支部补丁文件(现在应该工作的文件路径有一个匹配的文件)
  • 提交的临时党支部
  • CHEC KOUT掌握
  • 摘樱桃最后一次修订的临时党支部

这是为了让混帐可以跟踪名称变化,能够成功地应用它。我已经做了很多次,git的文件重命名算法往往是正确的。

+0

这回答其他的东西,但不是这个问题。问题没有需要修补的文件,只有从一个存储库移到另一个存储库的文件。 –

6

可以使用

git format-patch sha1 -- file1 file2 ... 

的任何文件可以是一个旧文件(之前的重命名)或现有的文件中获得的早于提交sha1少数几个特定文件而不是补丁。

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

git format-patch --root sha1 -- file1 file2 ... 

所以你的情况,所有的承诺到现在为止(HEAD)的六个文件的:

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 
+0

所以我需要知道影响所有位置的所有文件的所有提交ID吗? –

+0

不,只是你想要的第一个。如果你想*这些文件的所有提交*,只需输入'origin'作为sha1。 –

+0

@AsbjørnUlsberg:'format-patch'将生成一系列补丁,这将允许重新创建一个线性历史记录。它不会允许您通过合并“移植”分支机构的历史记录 - 一个单独的补丁程序不包含有关其父母的信息。 – LeGEC

1

为了实现通过合并来解决问题的目标(而不是通过格式化补丁来移动单个补丁作为问题),可以删除新提交中的所有其他文件,然后将该提交合并到存储库中S插入目标存储库(改编自https://stackoverflow.com/a/10548919/7496656):

cd path/to/project-a 
git checkout -b for-b master # or whichever branch you want to merge from 
git rm -r . 
git checkout HEAD -- src/moved/PriceValue.cs tests/moved/PriceValueTests.cs 
git commit 
cd path/to/project-b 
git remote add project-a path/to/project-a 
git fetch project-a 
git merge --allow-unrelated-histories project-a/for-b 
git remote remove project-a 
cd path/to/project-a 
git branch -D for-b 

这样做的好处是所有的历史是存在的,提交的ID保持不变,没有必要兼顾单次的提交,也没有找到他们。这可具有一个线性化视图(如git log),而不是图表视图(如gitk)可能变得更混乱作为无关提交的数目变得更大的缺点。

人们可以在合并之前附加过滤库project-a,隐藏不相关的文件或提交。然而,该缺点是:如果你这样做跨库合并不止一次,也可能在其他方向,它使历史不干净的共同历史只(每一次合并)多次发生。这也会使这个解决方案比你最初尝试的解决方案更困难。这也会有不利之处,即提交ID不会保持不变,因此找到跨存储库的相同提交并不容易。

相关问题