如何將現有的Git存儲庫導入另外一個?

我在名爲XXX的文件夾中有一個Git存儲庫,還有第二個名爲YYY的 Git存儲庫。 git

我想將XXX存儲庫做爲名爲ZZZ的子目錄導入YYY存儲庫,並將全部XXX的更改歷史記錄添加到YYYfetch

以前的文件夾結構: 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


#1樓

我只想從其餘存儲庫(XXX)導入一些文件。 子樹對我來講太複雜了,其餘解決方案都行不通。 這是我所作的: 開發

ALL_COMMITS=$(git log --reverse --pretty=format:%H -- ZZZ | tr '\n' ' ')

這爲您提供了一個空格分隔的全部提交列表,這些列表以相反的順序影響了我要導入的文件(ZZZ)(您可能還必須添加--follow才能捕獲重命名)。 而後,我進入目標存儲庫(YYY),將另外一個存儲庫(XXX)添加爲遠程存儲,從中進行了獲取,最後: rem

git cherry-pick $ALL_COMMITS

它將全部提交添加到您的分支中,所以您將擁有全部文件及其歷史記錄,而且能夠對它們執行任何操做,就像它們一直在此存儲庫中同樣。 get


#2樓

我認爲您可使用「 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)

#3樓

我不知道這樣作的簡單方法。 您能夠這樣作:

  1. 使用git filter-branch在XXX存儲庫上添加ZZZ超級目錄
  2. 將新分支推送到YYY存儲庫
  3. 將推入的分支與YYY的樹幹合併。

若是聽起來很吸引人,我能夠詳細編輯。


#4樓

在Git倉庫自己中有一個衆所周知的實例,在Git社區中被統稱爲「 有史以來最酷的合併 」(在發給Git郵件列表的電子郵件中使用的主題行Linus Torvalds以後,它描述了這一點)。合併)。 在這種狀況下, gitk Git GUI如今是Git的一部分,實際上曾經是一個單獨的項目。 Linus設法經過如下方式將該存儲庫合併到Git存儲庫中:

  • 它在Git存儲庫中的顯示就好像它一直是做爲Git的一部分開發的同樣,
  • 全部的歷史都保持不變
  • 它仍然能夠在其舊倉庫自主研發的,具備改變單純是git pull版。

該電子郵件包含重現所需的步驟,但這不是爲了令人膽怯:首先,利納斯 Linus) 撰寫了吉特 Git),因此他可能比您或我對這件事瞭解的更多,其次,這是將近5年前和Git,從那時起至關大的改進,因此也許如今是很容易。

特別是,我想如今在這種狀況下,會使用gitk子模塊。


#5樓

可能最簡單的方法是將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添加了下面答案中提到的子樹合併。 我今天可能會使用該方法,儘管這種方法固然仍然可使用。

相關文章
相關標籤/搜索