Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在另一个存储库中使用git存储库?_Git_Git Submodules_Multiple Repositories - Fatal编程技术网

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

如何在另一个存储库中使用git存储库?,git,git-submodules,multiple-repositories,Git,Git Submodules,Multiple Repositories,我有一个Git媒体存储库,我保存了所有JavaScript和CSS主文件以及我将在各种项目中使用的脚本 如果我在自己的Git存储库中创建了一个新项目,那么如何在新项目中使用媒体存储库中的JavaScript文件,从而在进行更改时不必更新脚本的两个副本 关键是git子模块 开始阅读或的子模块章节 假设您有存储库PROJECT1、PROJECT2和媒体 cd /path/to/PROJECT1 git submodule add ssh://path.to.repo/MEDIA git commit

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


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

关键是git子模块

开始阅读或的子模块章节

假设您有存储库PROJECT1、PROJECT2和媒体

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"
在另一个回购协议上重复

现在,最酷的事情是,任何时候你向媒体提交更改,你都可以这样做:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"
这只是记录了一个事实,即PROJECT2中的媒体子模块现在是XYZ版本

它可以让您100%控制每个项目使用的媒体版本git子模块非常好,但您需要对它们进行实验和了解

权力越大,屁股就越容易被咬


如果我能很好地理解你的问题,你需要以下几点:

  • 将媒体文件存储在一个git存储库中,许多项目都使用该存储库
  • 如果您在本地计算机的任何项目中修改媒体文件,它应该立即出现在其他每个项目中(因此您不希望一直执行提交+推送+拉取操作)
  • 不幸的是,对于你想要的东西没有最终的解决办法,但是有一些事情可以让你的生活更轻松

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

    如果您不需要知道这一点,那么解决方案很简单:

  • 为媒体文件创建一个存储库,并为每个项目创建一个存储库
  • 在项目中创建指向本地克隆媒体存储库的符号链接。您可以创建一个相对的符号链接(例如./media),并假设每个人都将签出项目,以便媒体目录位于同一位置,或者将符号链接的名称写入.gitignore,每个人都可以决定将媒体文件放在何处
  • 但是,在大多数情况下,您都希望了解此版本控制信息。在这种情况下,您有两种选择:

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

  • 使用子模块(如答案1所述)。通过这种方式,您可以将媒体文件存储在一个存储库中,并且项目将只包含对特定媒体repo版本的引用。但通过这种方式,您通常会有许多媒体存储库的本地副本,并且无法在所有项目中轻松修改媒体文件

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

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

  • 您可以将媒体存储库的一个副本作为远程存储库添加到所有项目中

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

    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),因为您没有与其他用户共享它们。

    考虑使用子模块而不是子模块,这将使您的repo用户的生活更加轻松。您可以在中找到更详细的指南。

    我对其他答案建议的子树和子模块有问题。。。主要是因为我使用的是SourceTree,它似乎有很多bug

    相反,我最终使用了符号链接,这似乎效果很好,所以我将其作为一种可能的替代方案发布在这里

    这里有一个完整的指南:

    但基本上,您只需要在提升的命令提示符中链接这两条路径。确保使用/J硬链接前缀。大致如下:mklink/jc:\projects\MainProject\plugins C:\projects\SomePlugin

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

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

    链接文件夹后,您可能需要忽略主存储库中引用该文件夹的文件夹。否则你就可以走了


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

    下面是另一篇关于子树与子模块的信息性文章:根据这篇文章,缺点之一是:>不在提交中混合超级和子项目代码的责任在于您。没有人有时间这样做(IMO)对于您在Apache的
    www
    文件夹中工作的web相关项目,您应该在
    www
    文件夹或项目的根目录中放置一个
    .htaccess
    文件,其中包含
    Options+FollowSymLinks
    ,或者更好的是
    {newline}Options+FollowSymLinks{newline}在{new line}
    上重写引擎(将{code>{new line}替换为实际的新行`)。此工作流提醒我使用专用NPM模块。如果您希望默认为最新版本,则可以添加脚本来传播媒体委员会