2012-08-06 185 views
25

我有一個包含子目錄的git存儲庫。示例dirA/dirB。 有沒有辦法在Unix服務器上執行git clone以僅從子目錄(dirB)中提取文件?用git克隆子目錄

是否有其他的git命令而不是克隆會這樣做?

我該如何git一個特定的文件?

+6

http://stackoverflow.com/questions/600079/is-there-any-way-to-clone-a-git-repositorys-sub-directory-only – supervacuo 2012-08-06 20:04:29

+1

[簡單的答案](http:// stackoverflow .com/a/2466755/287948) – 2014-11-01 12:00:28

回答

2

如果您只想克隆存儲庫的某些部分,則應該查看git submodules

子目錄由特定的git存儲庫管理,並作爲子模塊在主存儲庫中引用。

克隆主資源庫時,子模塊不會自動克隆。

+3

克隆主資源庫時,子模塊不會自動克隆?爲什麼?它荒謬:( – hugemeow 2012-08-26 05:59:09

+7

這不回答這個問題,它基本上說:「我沒有你的問題的答案,所以我會回答另一個問題,因爲這是我認爲你應該做的。」 – 2016-02-22 13:53:37

+0

@EduardoBezerra確實,我更喜歡一個答案,然後對備選方案進行評論。檢查布魯諾托馬斯答案 – 2016-05-27 09:41:45

0

Git在存儲庫級別上工作。您將無法僅選擇一個子目錄。如果您感興趣的存儲庫具有Web界面,則可以導航到您的子目錄並抓取它。

+0

是的,git在存儲庫上工作,但是由於數據移動性的挑戰,希望進行輕量級結賬的願望很高。 – cgseller 2017-12-27 18:03:51

28

假設您的項目位於名爲project的目錄中,並且您只需要那些觸及project/dirB的提交。

然後:

git clone project/ subproject/ 
cd subproject 
git filter-branch --prune-empty --subdirectory-filter dirB HEAD 

subproject現在將包含混帳歷史其中涉及dirB

+0

工程就像一個魅力......! – Ahsan 2013-05-31 07:17:07

+2

這很好地抓住了最初的子目錄內容,但是當我執行後續的'pull'時,它會與原始分支合併... – monkut 2015-04-02 05:26:40

+0

如果您不希望整個git歷史記錄,請添加' - -depth 0'標誌。 – CelticParser 2016-02-04 23:29:43

1

我想與大家分享一個解決方法。您可以克隆整個回購,然後創建一個symulink的子目錄:

mkdir <repo_dir> 
cd <repo_dir> 
git clone <repo_url> 
ln -s <sub_dir> <your_location_where_you_want_to_checkout_sub_dir> 

再次,這是不是一個解決方案 - 只是一種變通方法。您仍然可以克隆整個回購,並且只能從中提取更改。但是,這在我的一些情況下很有用。

0

這不是真的克隆,但是如果你只是想要一個項目的一部分,開始一個新的回購,進入你的回購和

git archive master <subdir> | tar -x -C /somewhere/else 

然後去/地方/ else和開始一個新的回購有。