2010-03-29 74 views
31

假設我的git倉庫的結構如下:提取git存儲庫的一部分?

/.git 
/Project 
/Project/SubProject-0 
/Project/SubProject-1 
/Project/SubProject-2 

和檔案庫有相當長的一段提交。現在其中一個子項目(SubProject-0)增長很大,我想將SubProject-0取出並將其設置爲獨立項目。是否有可能從父git存儲庫中提取涉及SubProject-0的所有提交歷史記錄並將其移至新的歷史記錄?

+2

請注意,這是一個http://stackoverflow.com/questions/359424/detach-subdirectory-into-separate-git-repository(如吉姆DeLaHunt在他的答案中所述)的副本。 – 2012-10-03 06:36:39

回答

36

http://git-scm.com/docs/git-filter-branch

我認爲你需要像

git filter-branch --subdirectory-filter Project/SubProject-0 --prune-empty -- --all 

在倉庫的一個克隆。

+0

謝謝!奇蹟般有效! – Rio 2010-03-29 14:01:25

+2

@Rio您可能還想使用'--prune-empty'選項來清除僅觸及'Project/SubProject-0'的提交。 – 2010-03-29 15:07:51

+0

哇完美!謝謝 – alvatar 2010-10-10 15:30:35

1

我需要做類似的事情,但我想從本質上將一個子項目從一個回購移到另一個。我所做的是使用fetch,因爲它可以從任何來源獲取對象。

因此,基本上,我創建了一個新分支,刪除了該分支中不需要的東西,然後使用git fetch將分支從一個回購倉庫拉到另一個倉庫。一旦我有了這些對象,合併就完成了。

E.g.

在具有原始材料庫:

git checkout -b temp master 
    git rm -r Unneeded_stuff 
    git commit -m 'pruning' 

然後,你可以從一個存儲庫分支提取到一個完全不同的(無關):

cd /path/to/other/repository 
    git fetch /path/to/source/repo temp:temp 

其中溫度:溫度手段「在源上獲取temp並將其保存爲temp」。從那裏你可以將結果合併到你的主人。

git merge temp 

然後,您可以刪除臨時分支,因爲它不是你想與原來的回購合併一些第一種情況,而在第二種情況下,你把它合併。

我確定這些步驟可能會被壓縮一點,但這個設置看起來不錯而且清晰。

+0

對不起,你會發現一箇舊帖子,但這是回答一個有用的,但不同於OP的問題。你可以爲這個答案創建一個新的q/a對嗎?這將使它更容易找到。 – tacaswell 2014-02-18 15:20:04

+0

,最好使用過濾器方法創建一個只包含要移動的文件的臨時存儲庫,然後執行臨時存儲庫的合併步驟,因爲這樣做仍然具有原始存儲庫的完整歷史記錄(只是作爲最後一次提交的刪除步驟)。 – tacaswell 2014-02-18 15:22:01