如何在另一个仓库中使用git仓库?
我有一个Git媒体仓库,在那里我保留了我将用于各种项目的所有JavaScript和CSS主文件和脚本。
如果我在自己的Git仓库中创build了一个新的项目,如何在我的新项目中使用来自媒体库的JavaScript文件,这样我就不必在更改时更新这两个脚本的副本?
好问题。 关键是git submodules 。
开始阅读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"
这只logging了MEDIA子模块WITHIN PROJECT2现在版本为XYZ的事实。
它使您可以100%控制每个项目使用的MEDIA版本。 Git子模块是伟大的,但你需要尝试和了解它们。
拥有巨大的力量就会成为被咬伤的好机会。
考虑使用子树而不是子模块,这将使您的回购用户的生活更容易。 您可以在Pro Git书籍中find更详细的指南。
如果我理解你的问题,你需要以下几点:
- 让你的媒体文件存储在一个单一的git仓库中,许多项目都使用它
- 如果您在本地机器的任何项目中修改媒体文件,它应该立即出现在其他所有项目中(因此您不需要一直提交+ push + pull)
不幸的是,没有最终的解决办法,但是有一些事情可以让你的生活更轻松。
首先,您应该决定一件重要的事情:是否要为项目存储库中的每个版本存储对媒体文件版本的引用? 例如,如果您有一个名为example.com的项目,您是否需要知道2周前使用过哪种style.css,或者最新的版本总是(或大部分)最好?
如果你不需要知道,解决方法很简单:
- 为媒体文件创build一个存储库,为每个项目创build一个存储库
- 在您的项目中创build一个指向本地克隆媒体存储库的符号链接。 你可以创build一个相对的符号链接(例如../media),并假设每个人都将签出项目,以便媒体目录位于同一位置,或者将符号链接的名称写入.gitignore,并且每个人都可以决定他/她放置媒体文件的位置。
然而,在大多数情况下,您想知道这个版本信息。 在这种情况下,你有两个select:
-
将每个项目存储在一个大型存储库中 此解决scheme的优点是您将只有一个媒体存储库的副本。 最大的缺点是在项目版本之间切换要困难得多(如果你签出一个不同的版本,你总是会修改所有的项目)
-
使用子模块(如答案1中所述)。 通过这种方式,您可以将媒体文件存储在一个存储库中,项目将只包含对特定媒体回购版本的引用。 但是这样你通常会拥有很多媒体库的本地拷贝,并且你不能在所有的项目中轻松修改媒体文件。
如果我是你,我可能会select第一个或第三个解决scheme(符号链接或子模块)。 如果你select使用子模块,你仍然可以做很多事情来让你的生活更轻松:
-
在提交之前,您可以重命名子模块目录,并将符号链接添加到通用媒体目录。 当你准备提交时,你可以删除符号链接,然后移除子模块,然后提交。
-
您可以将媒体存储库的一个副本作为远程存储库添加到您的所有项目中。
您可以通过以下方式将本地目录添加为远程文件:
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),因为你没有与其他用户共享它们。
我有其他答案build议的子树和子模块的问题…主要是因为我使用SourceTree,它似乎相当错误。
相反,我结束了使用SymLinks,似乎工作得很好,所以我在这里张贴它作为一个可能的select。
这里有一个完整的指南: http : //www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/
但基本上你只需要在提升的命令提示符下链接两个path。 确保使用/ J硬链接前缀。 沿着这些线:mklink / JC:\ projects \ MainProject \ plugins C:\ projects \ SomePlugin
您也可以使用相对的文件夹path,并将其放入一个蝙蝠中,以供每个人在首次签出项目时执行。
例如:mklink / J。\ Assets \ TaqtileTools .. \ TaqtileHoloTools
文件夹被链接后,您可能需要忽略引用它的主存储库中的文件夹。 否则,你很好去。
注意我已经从另一个post删除了我的重复答案,因为那个post被标记为这个副本的问题。