我在名爲XXX的文件夾中有一個Git存儲庫,還有第二個名爲YYY的 Git存儲庫。 git
我想將XXX存儲庫做爲名爲ZZZ的子目錄導入YYY存儲庫,並將全部XXX的更改歷史記錄添加到YYY 。 fetch
以前的文件夾結構: spa
├── XXX │ ├── .git │ └── (project files) └── YYY ├── .git └── (project files)
文件夾結構以下: code
YYY ├── .git <-- This now contains the change history from XXX ├── ZZZ <-- This was originally XXX │ └── (project files) └── (project files)
能夠作到這一點,仍是必須使用子模塊? orm
我只想從其餘存儲庫(XXX)導入一些文件。 子樹對我來講太複雜了,其餘解決方案都行不通。 這是我所作的: 開發
ALL_COMMITS=$(git log --reverse --pretty=format:%H -- ZZZ | tr '\n' ' ')
這爲您提供了一個空格分隔的全部提交列表,這些列表以相反的順序影響了我要導入的文件(ZZZ)(您可能還必須添加--follow才能捕獲重命名)。 而後,我進入目標存儲庫(YYY),將另外一個存儲庫(XXX)添加爲遠程存儲,從中進行了獲取,最後: rem
git cherry-pick $ALL_COMMITS
它將全部提交添加到您的分支中,所以您將擁有全部文件及其歷史記錄,而且能夠對它們執行任何操做,就像它們一直在此存儲庫中同樣。 get
我認爲您可使用「 git mv」和「 git pull」來作到這一點。 it
我是一個不錯的git noob-請注意您的主存儲庫-但我只是在temp目錄中嘗試了此操做,它彷佛有效。 io
首先-重命名XXX的結構以匹配它在YYY內時的外觀:
cd XXX mkdir tmp git mv ZZZ tmp/ZZZ git mv tmp ZZZ
如今XXX看起來像這樣:
XXX |- ZZZ |- ZZZ
如今使用「 git pull」來獲取更改:
cd ../YYY git pull ../XXX
如今YYY看起來像這樣:
YYY |- ZZZ |- ZZZ |- (other folders that already were in YYY)
我不知道這樣作的簡單方法。 您能夠這樣作:
若是聽起來很吸引人,我能夠詳細編輯。
在Git倉庫自己中有一個衆所周知的實例,在Git社區中被統稱爲「 有史以來最酷的合併 」(在發給Git郵件列表的電子郵件中使用的主題行Linus Torvalds以後,它描述了這一點)。合併)。 在這種狀況下, gitk
Git GUI如今是Git的一部分,實際上曾經是一個單獨的項目。 Linus設法經過如下方式將該存儲庫合併到Git存儲庫中:
git pull
版。 該電子郵件包含重現所需的步驟,但這不是爲了令人膽怯:首先,利納斯( Linus) 撰寫了吉特( Git),因此他可能比您或我對這件事瞭解的更多,其次,這是將近5年前和Git,從那時起至關大的改進,因此也許如今是很容易。
特別是,我想如今在這種狀況下,會使用gitk子模塊。
可能最簡單的方法是將XXX內容拉入YYY中的一個分支,而後將其合併到master中:
在YYY中 :
git remote add other /path/to/XXX git fetch other git checkout -b ZZZ other/master mkdir ZZZ git mv stuff ZZZ/stuff # repeat as necessary for each file/dir git commit -m "Moved stuff to ZZZ" git checkout master git merge ZZZ --allow-unrelated-histories # should add ZZZ/ to master git commit git remote rm other git branch -d ZZZ # to get rid of the extra branch before pushing git push # if you have a remote, that is
實際上,我只是用幾個存儲庫嘗試了一下,而且有效。 與Jörg的答案不一樣,它不會讓您繼續使用其餘回購協議,但我認爲您不管如何都沒有指定。
注意:因爲這是最初於2009年編寫的,所以git添加了下面答案中提到的子樹合併。 我今天可能會使用該方法,儘管這種方法固然仍然可使用。