如何在另一个存储库中使用git存储库?


282

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

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


请从@ ruslan-kabalin 查看下面的子树 答案。注意:预先提交(或过量提交)钩子是处理Robert Dundon
Hedgehog

Answers:


347

关键是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"

这就记录了MEDIA子模块WITHIN PROJECT2现在的版本为XYZ。

它使您可以100%控制每个项目使用的MEDIA版本。 git子模块很棒,但是您需要试验并了解它们。

强大的力量带来了被咬在臀部的巨大机会。


这个工作流程让我想起了使用私有NPM模块stackoverflow.com/questions/7575627/…–
cyrf

如果您希望默认版本为最新版本,则可以添加脚本以将MEDIA提交传播到所有相关项目。
jiggunjer'8

3
它如何与github集成?
theonlygusti


20

如果我很了解您的问题,那么您需要执行以下操作:

  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

如果您在/ 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)删除这些提交,因为您尚未与其他用户共享这些提交。


1
对于在Apache www文件夹中工作的与Web相关的项目,应将.htaccess文件放置在文件www夹或项目的根目录中,或者在其中Options +FollowSymLinks放置,或者更好<IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule>{new line}用实际的新行代替)

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.