2011-01-14 40 views
2

因爲新的見解而更新:五年後,當我看到這個問題時,我意識到這源於嘗試使用版本控制系統作爲包管理器。這當然會導致各種意想不到的問題,我們不應該這樣使用它。如果您正在閱讀這個問題,我建議您搜索一下您的首選語言的軟件包管理器。Mercurial知識庫縮小克隆?

我的原問題:我目前正在從Subversion轉移到Mercurial,我不得不說我不後悔這個決定。然而,當試圖轉換我的項目時,我碰到了一個Mercurial的問題,我似乎無法修復。我有兩個不同的項目:一個是框架,另一個是依賴於該框架的應用程序。下面是該倉庫的樣子:

框架庫:

  • 文檔/
  • 部署/
  • 的lib/
  • 測試/

應用程序庫:

  • 應用/
  • 配置/
  • 的lib/
  • 測試/
  • WWW/

我想什麼是應用程序的lib目錄中包含的副本框架的lib /目錄。我曾經使用svn:externals來做到這一點。現在,我知道Mercurial支持concept of subrepositories,但這看起來不像「正確」的解決方案,因爲它實際上並不像我想要的那樣拉入lib /目錄,因爲您仍然必須拉和推手動更改。這個,再加上一次你克隆框架庫,你會得到所有它,而不僅僅是lib /目錄。我只需要lib /目錄,而不是測試或文檔。

現在,我想出了兩個不同的解決方案來解決這個問題,但我不知道哪個是最好的。第一種解決方案是將框架完全克隆到不同的目錄中,並在指向框架的lib /目錄的應用程序的lib /目錄中創建符號鏈接。把符號鏈接放入.hgignore應該確保一切都很好,我想呢?這意味着您可以編輯框架代碼並進行提交,您也可以編輯應用程序的代碼並進行提交。

另一種選擇是擁有多個存儲庫。整個框架被取消,這意味着您將獲得docs /,deploy /,test/etc.目錄,這些目錄在框架的使用不需要。我認爲可能純粹爲圖書館創建一個存儲庫可能是一個解決方案,儘管我真誠地懷疑它,因爲單元測試非常依賴圖書館本身。

有沒有人知道這個問題的體面的解決方案?

+0

類似問題(和答案)在上[如何克隆在水銀的存儲庫的子文件夾?(http://stackoverflow.com/questions/920355/how-do-i-clone-a- sub-folder-of-a-repository-in-mercurial/40355673) – Anon 2016-11-01 07:24:21

回答

2

如果您只需要引用庫,則應將庫分隔成單獨的存儲庫。

只要你真正只需要參考它。引用包含lib目錄+其他內容的存儲庫的問題是什麼,除了「它感覺不對」之外呢?

至於「仍然需要手工拉動和拉動」,當你拉動你的主克隆時,它也會拉動subrepos,但它不會將它們更新爲新版本,這是一件好事,你需要手動完成,就像使用Subversion一樣。

+0

那麼,那。將單元測試放在生產環境中感覺不對:它應該沒有這些能力。我將把lib分成它自己的存儲庫,所以我可以這樣做,謝謝你的回答。 – 2011-01-17 09:00:15

+0

通常這是通過部署腳本處理的 – 2011-01-17 12:14:03

2

您應該將不同的組件放在它們自己的存儲庫中。然後,當創建應用程序,則可以使用convert extension創建pullabale框架儲存庫出正常之一:

$ hg convert --filemap map.txt framework new-framework 

與含有重命名的map.txt /包括/排除(以下一個應該只包括lib目錄和移動都在那裏庫根):

include lib 
rename lib . 

從申請回購,現在你只需拉框架回購(使用-f第一次,因爲庫可能會無關彼此)。

$ cd project 
$ hg pull -f ../new-framwork 
$ hg merge 

現在,當開發流程,你就必須每次都重新創建轉換回購你拉你去好了。實際上,我們的框架存儲庫上有一個hook,它在每個更改組(每次推送)上重新創建轉換後的回購。

這種方式,你有自己的倉庫都工作區(應用程序和框架),而應用程序回購包含完整的框架,歷史,能夠通過簡單地從轉換回購拉動更新。