2010-03-11 27 views
104

我有一個使用git的項目,我只想克隆或拉一個特定的目錄,就像myproject/javascript就像subversion一樣。
進行一些更改,提交併再次推回。
有可能嗎?如何用git拉特定目錄

+3

稀疏結帳可能會讓您感興趣(即使您仍然需要獲取所有內容):請參閱http://stackoverflow.com/questions/2416815/how-to-git-pull-all-but-one-folder/2416991# 2416991 – VonC 2010-03-11 14:21:37

回答

143
  1. cd到你的回購副本頂部
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • 其中 「path/...」 略低於含回購根(3)開始在目錄中的 「.../file
+2

這就是答案......謝謝! – Paul 2011-01-27 06:38:02

+1

剛剛意識到我誤解了這個問題。我的回答是解決如何簽出單個文件,然後可以修改和提交。 – vergueishon 2011-02-04 20:20:41

+0

您提到了問題的標題,這已經夠好了。這只是救了我,所以就我而言,這是正確的答案 - 尤其是因爲這是Google在這個問題上的熱門話題。 – Morgon 2011-11-01 14:39:32

15

這是不可能的。你需要拉所有的存儲庫或沒有。

+1

即使您需要*獲取*所有內容,在這種情況下,是否會引起稀疏檢出工作樹的興趣?見http://stackoverflow.com/questions/2416815/how-to-git-pull-all-but-one-folder/2416991#2416991 – VonC 2010-03-11 14:22:46

+10

只是爲了增加這一點,你不能只拉一個目錄的原因是因爲git使用數據語義跟蹤,而不是文件語義跟蹤,因此您可以無縫地將代碼(或其他數據)移入和移出文件,而無需告知源跟蹤系統(直到您更新了課程)。因此,代碼可以移動無縫地進出目錄,因此只抓取一個目錄並沒有多大意義。希望這可以幫助。 – OmnipotentEntity 2010-10-29 04:38:28

+0

vergueishon的答案在下面爲我工作。 – Paul 2011-01-27 06:38:49

-1

Shingara是對的。 this mailing list thread中給出了這種行爲的解釋。如果你真的想這樣做,你可以使javascript dir成爲一個子模塊。

+3

你沒有在你的評論中回答這個問題,你提供了一個鏈接。如果鏈接失效,您的鏈接無效,您的答案也是如此。此外,鏈接上的內容不夠簡潔,易於閱讀。如果您總結或簡化鏈接中的內容,您的答案會很有幫助。 – leetNightshade 2017-02-02 20:44:10

0

有時候,你只是想看看以前的文件副本,而不需要通過diffs。

在這種情況下,對存儲庫進行克隆和檢出您感興趣的特定提交併查看該克隆存儲庫中的子目錄一樣簡單。因爲一切都是本地的,你可以在完成後刪除這個克隆。

4

我明白了。我會嘗試創建子模塊,看看是否適合我。我會報告結果。 編輯: 稀疏結帳和子模塊爲我制定。我用閱讀有關(由VonC和米歇爾·詹森給出)的鏈接:

How to git-pull all but one folder

http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout

http://vmiklos.hu/blog/sparse-checkout-example-in-git-1-7

http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html#_sparse_checkout

git submodule update

+0

git的子模塊功能並沒有特別好地實現。他們可能非常尷尬和困惑的工作。我個人會很好地解決git子模塊,直到解決所有的問題。 – user2268788 2015-05-07 21:03:56

7

也許這個命令可以幫到你:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit path/to/your/dir/or/file > files.tar 

「ET外星人瞧」

+2

這會下載一個特定的文件目錄爲了存檔的目的,這不會提取可以修改和推回的副本。 – leetNightshade 2017-02-02 20:41:37

46

在一個空目錄:

git init 
git remote add [REMOTE_NAME] [GIT_URL] 
git fetch REMOTE_NAME 
git checkout REMOTE_NAME/BRANCH -- path/to/directory 
+5

當接受的答案沒有時,這對我有用。 – 2016-08-14 14:39:31

+4

這是OP的正確答案。 – 2016-11-08 16:42:37

+0

這工作,如果你只是想使用遠程版本的文件來替換本地文件,我認爲 – John 2018-01-16 10:42:59

8

經過多番尋找一個答案,沒有找到,放棄,再等等努力,我終於找到了解決這在另一個線程SO:

How to git-pull all but one folder

複製粘貼那裏的東西:

git init 
git remote add -f origin <url> 
git config core.sparsecheckout true 
echo <dir1>/ >> .git/info/sparse-checkout 
echo <dir2>/ >> .git/info/sparse-checkout 
echo <dir3>/ >> .git/info/sparse-checkout 
git pull origin master 

要完成OP想要的工作(僅在一個目錄上工作),只需將該目錄添加到.git/info/sparse-checkout即可,請執行上述步驟。

許多感謝@cforbish!

+2

我在這裏發佈它主要是因爲每當我嘗試谷歌如何做到這一點,這是一個頂級的結果,並且該線程是甚至沒有接近顯示。 :(我感覺糟糕的複製粘貼,但我認爲這是最佳做法? – msb 2017-05-10 20:48:49