2017-04-27 47 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不會保持不變,因此找到跨存儲庫的相同提交併不容易。

相關問題