2011-09-28 120 views
2

我正在使用兩個主分支和兩個主文件夾的Git存儲庫。其中一個文件夾在兩個分支之間非常相似,另一個非常不同。這意味着,即使我只是處理公用文件夾,由於需要對其他文件夾進行的所有更新,兩個分支之間的切換也很慢。僅在Git中爲子目錄切換分支

是否可以在Git存儲庫中切換子文件夾的分支而不切換其餘存儲庫的分支?在Subversion中,我可以在任何子文件夾上使用svn switch,並且所有東西都是Just Work™,但我還沒有在Git中找到相同的東西。

理想情況下,當我在兩個分支共同的文件夾中工作時,我希望能夠在該文件夾中切換分支,提交到任一分支,並執行所有其他有用的Git善良,而無需等待其他文件夾被完全重寫。

只是爲了使事情複雜化,我使用git svn;我提到的兩個主要分支是主幹和底層Subversion存儲庫中的一個分支。

回答

3

我發現了一個新的解決方案:git-new-workdir。它不允許我切換子文件夾,但它確實讓我有獨立的工作目錄,我可以切換而不是使用「切換」操作。

它解決了下面的問題:我可以爲每個主分支創建一個工作目錄,每當我想要時不需要花費就可以交換它們,而且兩個工作目錄共享相同的Git存儲庫,所以我不需要兩個單獨的克隆Ben Lee建議在comments to his answer

爲了得到我的(Cygwin)系統上的腳本,我需要下載並安裝Git源代碼;它在那裏的contrib目錄中。

+0

不錯的解決方案,不知道這個! –

0

我不認爲這是可能的。 Git是一個內容跟蹤器,跟蹤內容的變化,而不是文件或文件夾。

作爲一種解決方法,您可以使用git-svn在一個Git存儲庫中獲取您的SVN中繼,並在另一個Git存儲中獲取SVN分支。

+0

實際上,Git明確地跟蹤文件和文件夾(或至少,文件和文件樹),*不*內容改變。這是Git和Subversion存儲庫之間的基本後端差異之一。 –

2

如果你真的希望能夠做到這一點,在Git中的唯一方法是建立子文件夾的子模塊http://book.git-scm.com/5_submodules.html

我猜的原因SVN允許這是因爲它把單獨的.svn文件在跟蹤當前狀態的每個子​​文件夾中。

+0

這看起來很有希望,但我看不到它與'git svn'一起工作,而不會失去對底層Subversion存儲庫中的所有標籤和分支的訪問(或至少使訪問更加複雜)。 –

3

你可以在git中用一個叫做「稀疏結賬」的東西來做到這一點。首先,您必須在您的項目中啓用此功能:

git config core.sparsecheckout true 

然後,您必須設置要檢出的目錄。在編輯器中打開.git/info/sparse-checkout,並列出要限制簽出的目錄(每個都在單獨一行中)。然後運行以下命令:

git read-tree -m -u HEAD 

您可以在稍後的某個點禁用sparecheckout以將行爲恢復正常。

+0

不完美:這會刪除沒有在'sparse-checkout'文件中列出的目錄,而我更喜歡它們在四處閒逛,只是一個人呆着。儘管如此,這看起來是一個不錯的選擇,謝謝! –

+0

特別是,這個問題是,當我開始和完成稀疏模式時,我需要檢查/刪除所有其他目錄。所以分支之間的交換很快,這要歸功於稀疏的結賬,但是進入和離開該模式仍然很慢。 –

+0

@me_and,是的,我同意這是一個問題。不確定最好的方式。也許在你的計算機上存儲兩個版本庫的克隆?一份副本爲普通展位設置了sparsecheckout,另一份爲常規全面結帳? –