2009-11-28 214 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

文件夹链接后,您可能需要忽略引用它的主存储库中的文件夹。否则,你很好走。

注意我从另一篇文章中删除了我的重复答案,因为该帖子被标记为此问题的重复问题。

相关问题