2009-11-28 217 views
224

我有一個Git媒體資源庫,在那裏我保留了我將用於各種項目的所有JavaScript和CSS主文件和腳本。如何在另一個存儲庫中使用git存儲庫?

如果我在其自己的Git存儲庫中創建了一個新項目,如何在我的新項目中使用來自我的媒體庫的JavaScript文件,這樣我就不必更新這兩個腳本副本當我做出改變?

回答

295

好問題。關鍵是git submodules

開始閱讀的Git Community Book或的Users Manual

說你有倉庫PROJECT1,PROJECT2和媒體子模塊章...

cd /path/to/PROJECT1 
git submodule add ssh://path.to.repo/MEDIA 
git commit -m "Added Media submodule" 

重複在其他回購...

現在,很酷的是,任何時候您對MEDIA進行更改時,都可以這樣做:

cd /path/to/PROJECT2/MEDIA 
git pull 
cd .. 
git add MEDIA 
git commit -m "Upgraded media to version XYZ" 

這隻記錄了MEDIA子模塊WITHIN PROJECT2現在版本爲XYZ的事實。

它可以讓您100%控制每個項目使用的MEDIA版本。 git submodules非常棒,但你需要試驗並瞭解它們。

隨着巨大的力量來到被咬傷的大好機會。

+0

該工作流讓我想起使用私人NPM模塊 http://stackoverflow.com/questions/7575627/can-you-host-a-private-repository-for-your-organization-to-use-with- npm#answer-7807279 – cyrf 2016-05-12 21:49:54

+0

如果您更喜歡默認是最新版本,您可以添加一個腳本來將MEDIA提交傳播到所有依賴項目。 – jiggunjer 2016-08-11 07:39:09

+2

這是如何與github集成的? – theonlygusti 2017-01-12 10:41:08

19

如果我理解你的問題以及您希望以下的事情:

  1. 具有存儲在一個單一的git倉庫,這是被許多項目
  2. 媒體文件如果修改的媒體文件在你的本地機器的任何項目中,它應該立即出現在其他所有項目中(因此你不想一直承諾+推+拉)

不幸的是,沒有最終的解決方案你想要什麼,但是有些事情可以讓你的生活更輕鬆。

首先,您應該決定一件重要的事情:是否要爲項目存儲庫中的每個版本存儲對媒體文件版本的引用?例如,如果您有一個名爲example.com的項目,您是否需要知道2周前使用過哪種style.css,或者最新版本始終(或大部分)最好?

如果你不需要知道,解決方法很簡單:

  1. 創建的媒體文件的存儲庫,併爲每個項目
  2. 建立在你的項目,其指向一個符號鏈接本地克隆的媒體庫。你可以創建一個相對的符號鏈接(例如../media),並假設每個人都會簽出該項目,以便媒體目錄位於相同的位置,或者將符號鏈接的名稱寫入.gitignore,並且每個人都可以決定他/她放置媒體文件。

但是,在大多數情況下,您想知道此版本信息。在這種情況下,你有兩個選擇:

  1. 儲存在一個大倉庫每一個項目。此解決方案的優點是您將只擁有媒體存儲庫的一個副本。最大的缺點是在項目版本之間切換要困難得多(如果您簽出不同的版本,您將始終修改所有項目)

  2. 使用子模塊(如答案1中所述)。通過這種方式,您可以將媒體文件存儲在一個存儲庫中,並且這些項目只包含對特定媒體回購版本的引用。但是這樣你通常會擁有許多媒體庫的本地拷貝,並且你不能在所有項目中輕鬆修改媒體文件。

如果我是你,我可能會選擇第一個或第三個解決方案(符號鏈接或子模塊)。如果您選擇使用子模塊你仍然可以做很多事情,使您的生活更輕鬆:

  1. 提交您可以重命名的子模塊目錄,把一個符號鏈接到一個公共媒體目錄之前。當你準備提交時,你可以刪除符號鏈接,然後移除子模塊,然後提交。

  2. 您可以將媒體存儲庫的一個副本作爲遠程存儲庫添加到所有項目中。

您可以添加本地目錄,遠程這種方式:

cd /my/project2/media 
git remote add project1 /my/project1/media 

如果修改/我/ PROJECT1 /媒體文件,你可以提交併從/我/項目2拉/媒體沒有它推到遠程服務器:

cd /my/project1/media 
git commit -a -m "message" 
cd /my/project2/media 
git pull project1 master 

你是自由的,因爲你還沒有與其他用戶共享他們以後刪除這些提交(與git的復位)。

+1

對於在Apache的'www'文件夾中工作的Web相關項目,您應該在'www'文件夾或項目的根目錄中放置'.htaccess'文件,其中包含'Options + FollowSymLinks',或者更好然後在新行上使用 {new line} Options + FollowSymLinks {new line} RewriteEngine'(用實際的新行代替'{new line}') – 2015-04-17 23:58:44

22

考慮使用subtree而不是子模塊,它會讓你的回購用戶的生活變得更容易。您可能會在Pro Git book中找到更詳細的指南。

+6

這裏是另一篇有關子樹vs 。submodule:http://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/ – 2014-11-30 22:23:42

+0

根據那篇文章,其中一個缺點是: >不混合super和sub的責任提交中的項目代碼和你在一起。沒有人爲此付出時間(海事組織) – 2016-11-22 14:59:57

2

我有問題與其他答案建議的子樹和子模塊...主要是因爲我使用SourceTree,它似乎相當錯誤。

取而代之,我結束了使用SymLinks,這似乎工作得很好,所以我在這裏發佈它作爲一種可能的選擇。

有一個完整的指南在這裏:http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

但基本上你只需要在mklink提升的命令提示符的兩條路徑。確保使用/ J硬鏈接前綴。沿着這些方向的東西:mklink/JC:\ projects \ MainProject \ plugins C:\ projects \ SomePlugin

你也可以使用相對文件夾的路徑,並將它放在一個蝙蝠中,以供每個人在第一次檢查時執行項目。

例如: mklink/J。\ Assets \ TaqtileTools .. \ TaqtileHoloTools

文件夾鏈接後,您可能需要忽略引用它的主存儲庫中的文件夾。否則,你很好走。

注意我從另一篇文章中刪除了我的重複答案,因爲該帖子被標記爲此問題的重複問題。

相關問題