使用Git,我想在我的项目中包含一些常见的JS / CSS库和/或实用程序方法(即来自另一个repo的特定文件),我希望它们能够如此总是是最新的。我真的不想要整个远程存储库。如果我可以处理远程文件的“本地副本”并将更改重新推送,那么可以获得奖励。
一个有点平行的例子:在ASP.NET中,我会通过引用(“remote”)其他库的.dll
文件(没有“copy local”)来做到这一点,所以每当我重新编译外部库时,我的项目就会指向最新的版本。
我的项目是...... MyProject ,我只想要一些来自外部存储库 ExternalLibrary 和 External2 的文件。我不想在其他地方克隆每个存储库,并将文件复制粘贴到我的存储库中。如果我对MyProject/scripts/common1.js
做了改进,我想将其推回 ExternalLibrary 。
相关参考资料:
答案 0 :(得分:13)
Git对选择远程项目中的选择文件没有任何支持。你可以用子树选出你想要的文件,然后找出一些重新获得它的策略,但这通常是复杂的,特别是如果你突然决定要比你最初选择的文件多一些。
我通常最终会使用symlinks
。这可以通过在项目中将项目添加为子模块,然后将文件符号链接到正确的位置来完成。
你的例子会是这样的:
$ git clone <url> myproject
$ cd myproject
$ git submodule add <url> external_library
$ git submodule add <url> external2
$ cd scripts
$ ln -s ../external_library/common1.js
$ ln -s ../external_library/plugin2.js
$ cd ../styles
$ ln -s ../external2/common.css
让符号链接在Windows中工作:
然后在你做任何改变之前我会去创建一个新的分支:
$ cd external_library
$ git checkout -b myproject
# make changes back in ../myproject
$ git commit <files> # in external_library
然后你可以将你的分支推送到github或其他东西并向作者提交拉取请求,以便为你的更改做出贡献。
你可以保持这样的同步:
$ cd external_library
$ git checkout master
$ git pull
$ git checkout myproject
$ git merge master
您还需要在子模块更改时更新父项目(例如git commit external_library
)。使用您的项目的任何人都需要git clone --recursive <url_to_myproject>
。
注意:您可以在不为项目使用单独分支的情况下实现大部分目标。使用对你最有意义的东西。