2015-10-07 112 views
4

我非常熟悉git櫻桃挑選。目前我正在嘗試從其他git存儲庫挑選幾個提交。 方案是如下:櫻桃挑選承諾從其他回購的git回購特定文件夾

A - > git倉庫( 「A /富/ B」,其中B是內部FOO的目錄)

乙 - > git倉庫

我的意圖是將git repo B提交到A/foo/B目錄的cherry-pick/apply-patches/merge提交。

A /富/ B

我知道它可以通過多種方式來實現,像合併,摘櫻桃和應用補丁。

我也曾嘗試下面的命令,這是實現我的意圖:

git --git-dir=../B/.git format-patch --stdout sha1^..sha1 | git am --directory='B/' 

但是,有沒有什麼辦法讓同摘櫻桃一樣的東西,以獲得預期的解決方案或其他任何完美的解決方案,使它起來。

請建議!!

謝謝:)

+0

子模塊怎麼樣? – CodeWizard

+0

如果您正在提交的提交移動目錄,則移動目錄和櫻桃提取提交只有一些共同之處。一般來說,你應該避免做大量的櫻桃選擇,如果你需要這個,你可能想要考慮一個選擇。 –

+0

@codeWizard我嘗試使用子模塊,鏈接https://groups.google.com/forum/#!topic/git-users/HXoX-kpkYkM,但問題是我無法保留文件級歷史記錄。我想要保留文件級歷史記錄。 – love

回答

2

您可以使用checkout-index或只是checkout。兩者都有優點和缺點。

使用Google Checkout指數

  1. 更改你的工作目錄,以回購A
  2. git --git-dir=../B/.git checkout-index -a --prefix=B/
  3. git add B
  4. git commit

checkout-index檢查出來(一名字暗示)存儲庫的索引。因此,您必須確保回購B的索引看起來像您想要的。親是你可以修改索引之前,你檢查出你的工作目錄。

使用Google Checkout

  1. 更改你的工作目錄,以回購A
  2. mkdir B
  3. git --git-dir=../B/.git --work-tree=B checkout HEAD -- .
  4. git add B
  5. git commit

checkout的專業人士是你可以選擇任何提交,因爲它是。使用分支,提交id或標記而不是HEAD

確認是,如果您簽出除HEAD之外的任何其他提交,HEAD和存儲庫B的索引將會更改。因此,如果您回到存儲庫B,您將看到此更改,如果您執行git status

如果我在它已經有一個目錄名B和我只是想摘櫻桃幾次提交從庫B到B目錄

與已經在文件夾中存在checkout-index文件B不會被覆蓋,直到您指定--force或只是-f

上面的checkout命令將覆蓋已存在的文件,因爲我在末尾使用了-- .。您可以通過將路徑替換爲.來選擇特定的文件。例如。如果你只想結賬src目錄。

git --git-dir=../B/.git --work-tree=B checkout HEAD -- src 
+1

感謝Rene的回答,如果我已經有一個目錄名稱B,我只想挑選一些從存儲庫B到B目錄的提交。對不起,我已經修改了一下這個問題。 – love

0

您可以使用submodules

Submodules/subtree基本上git倉庫內的另一個git倉庫。

子樹和子模塊之間的主要區別在於您的文件被管理的位置(作爲獨立存儲庫或在父存儲庫中)。

這是一個簡單的腳本,它創建2個存儲庫,然後將其中的一個添加爲第二個存儲庫的子模塊。

在這一點上並改變其子模塊文件夾內取得的「透明」回購(repo1)


# Clear old repositories if any 
rm -rf /tmp/repo1 
rm -rf /tmp/repo2 

# Creating new empty repositories 
git init repo1 
git init repo2 

# commiting to the first repository 
cd /tmp/repo1 
echo 'a' > file1.txt 
git add . 
git commit -m "Commiting to repo1" 

# commiting to the second repository 
cd /tmp/repo2 
echo 'b' > file2.txt 
git add . 
git commit -m "Commiting to repo2" 

# Adding repo2 as submodule of repo1 
cd /tmp/repo1 
git submodule add /tmp/repo2 repo2 
git submodule init 
git submodule update