2010-07-29 58 views
11

我正在使用git svn從SVN回購協議中提取的Git回購協議。在許多月前,SVN回購是從原始(上游)項目的源代碼包創建的。最初的項目有一個文件結構如下所示:如何修改一組Git修補程序中的文件路徑?

/ 
    COPYING 
    README 
    src/ 
     ...many source files... 

然而,當創建SVN回購協議,自述文件等,被剝離出去,並應用與src/作爲根創建的,所以回購現在看起來像:

/ 
    ...many source files 

我最近把這個SVN回購轉換成了一個Git回購。原始項目也在Git倉庫中,我想開始跟蹤上游的更改,以便我可以輕鬆看到自定義的更改已完成(並將補丁提交回原始項目,如果適用)。我在上游回購中發現我們的SVN回購是從創建的,所以現在我想將我們的更改應用於該提交(在分支中)。我可以使用git format-patch輕鬆地創建一組修補程序,並將它們應用於克隆的上游回購...除了文件結構不同之外,所以修補程序不再指向正確的文件。有沒有辦法將git format-patch中的補丁應用於克隆回購中的src/目錄? (請注意,Git補丁也具有必要的信息,例如原始作者姓名,電子郵件和日期,我也希望應用這些信息,而不必親手操作,即通過與GIT_AUTHOR_EMAIL等混合在一起)

+2

類似的問題:http://stackoverflow.com/questions/931882/how-to-apply-a-git-patch-from-one-repository-to-another – koppor 2012-04-23 19:00:56

回答

5

在我看來,你應該能夠使用git filter-branch來改變以前從SVN回購克隆的路徑。然後,在更新所有文件路徑後,現在可以使用git format-patch創建補丁,應用於新克隆的上游回購。

嘗試:

git filter-branch --tree-filter 'mkdir src; git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files src'

+0

幾乎可以工作,但是在src/'被組織成子目錄 - 這個解決方案直接在'src /'下直接移動它們。任何方式來移動整個子目錄樹? – mipadi 2010-08-03 14:52:54

+0

@mipadi:對,你是。我的錯誤實際上不是*測試*我寫的是:O。我在回答中糾正了這個錯誤。感謝您指出問題:) – 2010-08-03 16:08:35

+0

沒有biggie - 如果'src /'不包含任何子目錄(我忘了在我的問題中提到這一點),您的原始答案可以正常工作。 – mipadi 2010-08-03 16:24:11

2

我不得不做一些非常相似的事情,不是很漂亮,但它是可以管理的。我落得這樣做是:

git format-patch <commitish> --stdout > patches-for-upstream.mbox 
$EDITOR patches-for-upstream.mbox 

編輯器裏面,我看着這些位是共同的,需要改變,使「混帳上午」做我想要的東西。這竟然是三線,每個致力於在每個文件中承諾:

  • 開始diff --git a/path/to/file b/path/to/file
  • 行開頭的行--- a/path/to/file
  • 行開始+++ b/path/to/file

什麼編輯在這一點上需要做的就是通過這些類型的線,並且做出所需的更改,以便將所有修補程序應用於其他Git存儲庫。

我在Vim中使用了三個快速鍵入的宏YMMV。沿着線的東西:

  • 到下一行開頭diff --git a/
  • a
  • 變化路徑後往前走那條斜線,因爲你需要它是
  • 往前走斜線在b/(着從a文件下一個空格,然後/
  • 變化以同樣的方式將路徑作爲
  • NEX後牛逼線(---
  • 往前走a/
  • 變化路徑
  • 在下一行(+++
  • 往前走b/
  • 變化路徑

重複,直到文件完成。在Vim中,它只需要一個宏(qq<long string of commands>q),嘗試一次(@q),然後在整個文件([email protected])中執行。

保存該文件,進入其他Git回購,並嘗試git am它。

3

我最近有一個類似的問題。我的解決方案是創建一個新的目標資源庫和src子目錄,然後,我創建的源代碼庫一組修補程序:

/data/source-repository$ git format-patch -k --root 

然後這些補丁被應用到src目錄中的目標庫:

/data/target-repository$ git am -k --committer-date-is-author-date --directory src ../source-repository/*.patch 

源存儲庫中的所有修補程序都以目標存儲庫中的src結尾,即所有路徑都進行了相應的調整。

從那裏你可以再次創建補丁並將它們導入分支內的上游存儲庫。

+1

這與'git filter-branch --subdirectory-filter '結合使我可以完全將我的提交移動到不同的目錄。 – 2017-09-29 09:18:54