316

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

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

4

5 回答 5

378

关键是git submodules

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

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

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

在另一个 repo 上重复...

现在,很酷的是,任何时候你提交对 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 子模块很棒,但您需要尝试并了解它们。

强大的力量带来了被咬到臀部的绝佳机会。

于 2009-11-28T06:04:29.157 回答
30

考虑使用子树而不是子模块,它会让你的 repo 用户生活更轻松。您可以在Pro Git book中找到更详细的指南。

于 2012-11-21T15:23:18.950 回答
20

如果我很好地理解了您的问题,您需要以下内容:

  1. 将您的媒体文件存储在一个 git 存储库中,该存储库被许多项目使用
  2. 如果您在本地计算机的任何项目中修改媒体文件,它应该立即出现在其他每个项目中(因此您不想一直提交+推+拉)

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

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

如果您不需要知道,解决方案很简单:

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

但是,在大多数情况下,您想知道此版本信息。在这种情况下,您有两种选择:

  1. 将每个项目存储在一个大存储库中。此解决方案的优点是您将只有 1 个媒体存储库副本。最大的缺点是在项目版本之间切换要困难得多(如果您签出到不同的版本,您将始终修改所有项目)

  2. 使用子模块(如答案 1 中所述)。这样,您将媒体文件存储在一个存储库中,并且项目将仅包含对特定媒体存储库版本的引用。但是这样一来,您通常会拥有许多媒体存储库的本地副本,并且您无法轻松地修改所有项目中的媒体文件。

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

  1. 在提交之前,您可以重命名子模块目录并将符号链接放置到公共媒体目录。当您准备好提交时,您可以删除符号链接并重新删除子模块,然后提交。

  2. 您可以将媒体存储库的副本之一作为远程存储库添加到您的所有项目。

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

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 reset)自由删除这些提交,因为您尚未与其他用户共享它们。

于 2009-11-28T12:39:47.397 回答
6

相当多的项目,本质上是模块化的(因为 git 更喜欢不太大的存储库),不需要完整的配置阶段:您只需在给定的一组相对位置中布局多个存储库,然后您完成。

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

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

于 2021-07-01T12:33:32.837 回答
3

我遇到了其他答案建议的子树和子模块的问题……主要是因为我使用的是 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

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

示例:mklink /J .\Assets\TaqtileTools ..\TaqtileHoloTools

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

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

于 2016-05-26T17:04:36.370 回答