我有一个Git媒体存储库,其中保存了我将在各种项目中使用的所有JavaScript和CSS主文件和脚本。

如果我在自己的Git存储库中创建了一个新项目,如何在新项目中使用媒体存储库中的JavaScript文件,使我在进行更改时不必更新脚本的两个副本?


关键是git子模块。

开始阅读Git社区手册或用户手册的子模块章节

假设您有存储库PROJECT1、PROJECT2和MEDIA……

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"

这只是记录了PROJECT2内的MEDIA子模块现在处于版本XYZ的事实。

它可以让您100%控制每个项目使用的MEDIA版本。Git子模块很棒,但您需要尝试并学习它们。

力量越大,屁股被咬的几率越大。


如果我很了解你的问题,你想要以下东西:

您的媒体文件是否存储在一个git存储库中,许多项目都使用这个存储库 如果你在本地机器的任何一个项目中修改了一个媒体文件,它应该立即出现在每个其他项目中(所以你不希望一直都是提交+推+拉)

不幸的是,你想要的东西没有最终的解决方案,但有些事情可以让你的生活更轻松。

首先,您应该确定一件重要的事情:您是否希望在项目存储库中为每个版本存储对媒体文件版本的引用?例如,如果你有一个名为example.com的项目,你是否需要知道它2周前使用的是哪种样式。css,还是最新的总是(或大部分)最好的?

如果你不需要知道这些,解决方法很简单:

为媒体文件和每个项目创建一个存储库 在项目中创建一个指向本地克隆媒体存储库的符号链接。您可以创建一个相对的符号链接(例如../media),并假设每个人都将签出项目,以便媒体目录在相同的位置,或者将符号链接的名称写入.gitignore,每个人都可以决定他/她将媒体文件放在哪里。

然而,在大多数情况下,您都想知道这个版本信息。在这种情况下,你有两个选择:

Store every project in one big repository. The advantage of this solution is that you will have only 1 copy of the media repository. The big disadvantage is that it is much harder to switch between project versions (if you checkout to a different version you will always modify ALL projects) Use submodules (as explained in answer 1). This way you will store the media files in one repository, and the projects will contain only a reference to a specific media repo version. But this way you will normally have many local copies of the media repository, and you cannot easily modify a media file in all projects.

如果我是你,我可能会选择第一种或第三种解决方案(符号链接或子模块)。如果你选择使用子模块,你仍然可以做很多事情来让你的生活更简单:

在提交之前,您可以重命名子模块目录,并将符号链接放到公共媒体目录。当您准备提交时,您可以删除符号链接并将子模块移回,然后提交。 可以将媒体存储库的一个副本作为远程存储库添加到所有项目中。

您可以通过以下方式添加本地目录作为远程目录:

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

如果你修改了/my/project1/media中的一个文件,你可以提交它并从/my/project2/media中提取它,而不需要将它推送到远程服务器:

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

你可以稍后删除这些提交(git重置),因为你还没有与其他用户共享它们。


考虑使用子树而不是子模块,这会让你的回收用户的生活更容易。你可以在Pro Git书中找到更详细的指南。


我在子树和子模块上遇到了其他答案所暗示的问题……主要是因为我使用SourceTree,它似乎相当有bug。

相反,我最终使用SymLinks,这似乎工作得很好,所以我在这里发布它作为一个可能的替代方案。

这里有一个完整的指南:http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

但是基本上你只需要在一个提升的命令提示符中mklink这两个路径。确保使用/J硬链接前缀。mklink /J C:\projects\MainProject\plugins C:\projects\SomePlugin

您还可以使用相对文件夹路径,并将其放在一个bat中,以便每个人在第一次检查您的项目时执行。

操作: mklink /J .资产资产

一旦文件夹被链接,您可能需要忽略主存储库中引用它的文件夹。否则就可以开始了。

注意,我已经从另一篇文章中删除了我的重复答案,因为那篇文章被标记为与这篇文章重复的问题。


相当多的项目,本质上是模块化的(因为git更喜欢不那么大的存储库),不需要成熟的配置阶段:您只需在给定的相对位置集中布局大量的存储库,就完成了。

在这种情况下,应该很容易使用this、this和this repo,这是git子模块、子树等尝试完成的。他们可以胜任这项任务,但我不认为他们很容易,也不容易出错。

“Git回购中的Git回购”并不难:请参阅我的最简单的Git -subrepos示例。