我認爲這裏的問題是Git的設計和你正在尋求解決的問題之間的不匹配。
Git有助於跟蹤樹木。項目之間的依賴關係可以(也可能)形成一個Graph。樹是圖,但圖不一定是樹。由於您的問題是如何有效地表示圖形,樹不是該工作的最佳工具。
這裏有一個方法可能工作:
一個Git項目有它記錄了「提示」,指出哪些項目提交可能取決於,在那裏他們可以找到一個.gitmodules目錄,走什麼路內的項目他們預計將被插入。 (http://osdir.com/ml/git/2009-04/msg00746.html)
您可以添加一個腳本,它從一組項目中讀取此信息,將每個項目的.gitmodules文件中找到的提示映射到實際放置項目的文件系統上的位置,然後添加符號從git希望檢查子模塊的路徑鏈接到相應項目的實際文件系統位置。
此方法使用符號鏈接來突破樹模並構建圖。如果我們直接在git repos中記錄這些鏈接,我們會在各個項目中記錄特定於本地設置的相對路徑,並且這些項目不會像您想要的那樣「完全獨立」。因此,該腳本動態構建符號鏈接。
我在想,這種方法可能會以不希望的方式干擾git,因爲我們已經採取了希望找到一件事情的路徑,並將其他東西放在那裏。也許我們可以.gitignore符號鏈接路徑。但現在我們正在寫這些路徑兩次,並且違反了DRY。在這一點上,我們已經遠離假裝使用子模塊。我們可以在每個項目的其他地方記錄依賴關係,並保留git所期望的.gitmodules文件。因此,我們將構建自己的文件,比如.dependencies,並且每個項目都可以在其中聲明它的依賴關係。我們的腳本會在那裏查看,然後去建立它的符號鏈接。
嗯,我想我可能只是描述一個特設的包管理系統,有自己的輕量級封裝格式:)
megamic的建議似乎是一個不錯的使用git子模塊的給我。我們只處理跟蹤一個Set而不是一個Graph,並且一個Set很容易適合樹。一層深的樹本質上是一個父節點和一組子節點。
正如您所指出的那樣,這並不能完全解決您的問題中提到的問題。我們可以分爲兩種截然不同的類型:「我們可能感興趣的信息」: 1.來自項目版本的聲明(可能由項目作者提出)說「我需要項目Y的版本X」 2.您自己的構建設置使用的聲明「我已經成功地使用這套項目版本測試了我們的整個系統」
megamic的答案已解決(2)但對於(1)我們仍然希望項目告訴我們他們的依賴是什麼。然後我們可以使用(1)中的信息來計算我們最終將記錄爲(2)的那些版本集。這是一個足夠複雜的問題,以保證它自己的工具,這使我們回到包管理系統:)
據我所知,大多數優秀的包管理工具是爲特定語言或操作系統的用戶。查看Bundler在ruby世界中的'gem'包以及適用於Debian世界中的'.deb'包。
如果有人知道非常適合於'polyglot'(http://blog.heroku.com/archives/2011/8/3/polyglot_platform/)編程項目的語言中立,操作系統中立的解決方案,我會非常感興趣!我應該把它作爲一個問題。
中超,本身就是一個項目。不要因爲我稱之爲「超級」而認爲它沒有內容。 – 2009-09-14 03:21:39
但我希望每個項目都是獨立的。我喜歡git submodules被固定到一個特定的提交,而不是跟隨像svn外部,所以Core的變化不會立即破壞A,B和Super。 – 2009-09-14 04:19:33
您是否跟蹤分支或落實SHA完全取決於您。但是,針對您的問題的最佳答案是,既不可能同時擁有獨立項目和超級項目選項。在實踐中,我發現爲每個子項目制定一個超級項目並不是什麼大不了的事情。 – 2009-09-14 04:38:47