update - git是什麼




結合多個git存儲庫 (8)

git-stitch-repo會在命令行給出的git倉庫中處理git-fast-export --all --date-order的輸出,並創建一個適用於git-fast-import的流,它將創建一個新的存儲庫,其中包含所有提交樹中的所有提交,這些提交樹尊重所有源存儲庫的歷史記錄。

假設我有一個類似的設置

phd/code/
phd/figures/
phd/thesis/

由於歷史原因,這些都有自己的git存儲庫。 但我想將它們合併成一個簡單的事情。 例如,現在我可能會做兩套更改,並且必須執行類似操作

cd phd/code
git commit 
cd ../figures
git commit

這只是(現在)很好,只是執行

cd phd
git commit

似乎有幾種使用子模塊或從我的子庫中取出的方法,但這比我想要的要復雜一些。 至少,我會很高興

cd phd
git init
git add [[everything that's already in my other repositories]]

但是這看起來並不像一個班輪。 git中有什麼可以幫助我嗎?


@MiniQuark解決方案對我有很大的幫助,但不幸的是它沒有考慮源代碼庫中的標籤(至少在我的情況下)。 以下是我對@MiniQuark答案的改進。

  1. 首先創建一個包含合成回購和合併回購的目錄,為每個合併回收創建一個目錄。

    $ mkdir new_phd
    $ mkdir new_phd / code
    $ mkdir new_phd /數字
    $ mkdir new_phd / thesis

  2. 拉取每個存儲庫並獲取所有標籤。 (僅提供code子目錄的說明)

    $ cd new_phd / code
    $ git init
    $ git pull ../../original_phd/code master
    $ git fetch ../../original_phd/code refs / tags / *:refs / tags / *

  3. (這是對MiniQuark答案中第2點的改進)將new_phd/code的內容移動到new_phd/code/code並在每個標記前添加code_

    $ git filter-branch --index-filter'git ls-files -s | sed“s- \ t \”* - &code / - “| GIT_INDEX_FILE = $ GIT_INDEX_FILE.new git update-index --index-info && mv $ GIT_INDEX_FILE.new $ GIT_INDEX_FILE'--tag-name-filter'sed”s - 。* - code _& - “'HEAD

  4. 這樣做之後,將會有兩倍的標籤與之前進行過濾分支的次數相同。 舊標籤保留在回購中,並添加了帶有code_前綴的新標籤。

    $ git標籤
    是MyTag1
    code_mytag1

    手動刪除舊標籤:

    $ ls .git / refs / tags / * | grep -v“/ code_”| xargs rm

    對其他子目錄重複點2,3,4

  5. 現在我們在@MiniQuark的第3點中有目錄結構。

  6. 像MiniQuark anwser的第4點一樣,但是在執行pull操作之後,在刪除.git dir之前,取標籤:

    $ git fetch catalog refs / tags / *:refs / tags / *

    繼續..

這只是另一個解決方案。 希望它可以幫助別人,它幫助我:)


也許,簡單地(與前面的答案類似,但使用更簡單的命令)在每個單獨的舊版本庫中創建一個提交,將內容移動到一個適當命名的子目錄中,例如:

$ cd phd/code
$ mkdir code
# This won't work literally, because * would also match the new code/ subdir, but you understand what I mean:
$ git mv * code/
$ git commit -m "preparing the code directory for migration"

然後將這三個單獨的回購合併為一個新的回報,通過做如下行動:

$ cd ../..
$ mkdir phd.all
$ cd phd.all
$ git init
$ git pull ../phd/code
...

然後你會保存你的歷史,但會繼續一個回購。


你建議的順序

git init
git add *
git commit -a -m "import everything"

會起作用,但你會失去你的提交歷史。


其實,git-stitch-repo現在支持分支和標籤,包括帶註釋的標籤(我發現有一個我報告的bug,並且已經修復)。 我發現有用的是標籤。 由於標籤附加到提交,並且一些解決方案(如Eric Lee的方法)無法處理標籤。 您嘗試從導入的標籤中創建一個分支,它將撤銷任何git合併/移動,並將您發回,就像整合存儲庫與標籤來自的存儲庫幾乎相同。 此外,如果您在“合併/合併”的多個存儲庫中使用相同的代碼,則會出現問題。 例如,如果您有回購的A廣告B,都有標籤rel_1.0。 您將回購A和回購B合併到回購AB中。 由於rel_1.0標籤在兩個不同的提交中(一個用於A,另一個用於B),哪個標籤在AB中可見? 來自導入的回購A的標籤或來自導入的回購B的標籤,但不是兩者。

git-stitch-repo通過創建rel_1.0-A和rel_1.0-B標籤來幫助解決這個問題。 您可能無法檢出rel_1.0標籤並期待兩者,但至少可以看到兩者,理論上,您可以將它們合併到一個公共本地分支中,然後在該合併分支上創建一個rel_1.0標籤(假設您只是合併而不是更改源代碼)。 與分支機構一起工作會更好,因為您可以像每個回購分支一樣將分支合併到本地分支機構中。 (dev-a和dev-b可以合併成一個本地dev分支,然後可以推送到原點)。


在mainProject中合併第二個項目:

A)在第二個項目中

git fast-export --all --date-order > /tmp/secondProjectExport

B)在主項目中:

git checkout -b secondProject
git fast-import --force < /tmp/secondProjectExport

在這個分支中,做所有你需要做的重大轉換並提交它們。

C)然後回到主人和兩個分支之間的經典合併:

git checkout master
git merge secondProject

我也會在這裡拋出我的解決方案。 它基本上是一個相當簡單的bash腳本封裝,圍繞著git filter-branch 。 像其他解決方案一樣,它只遷移主分支並且不遷移標籤。 但是完整的主提交歷史已被遷移,並且它是一個簡短的bash腳本,所以用戶應該相對容易查看或調整。

https://github.com/Oakleon/git-join-repos






git