Git - 从其他仓库包含文件

29
使用Git,我想在我的项目中包含一些常见的JS / CSS库和/或实用程序方法 (即来自另一个存储库的特定文件),并且希望它们始终保持最新状态。我不想要整个远程存储库。如果我能够使用“本地副本”编辑远程文件并将更改推送回服务器,那就更好了。
一个相似的例子是,在ASP.NET中,我可以通过引用“远程”其他库的.dll文件(而不是“本地复制”)来实现这一点,这样无论何时重新编译外部库,我的项目都指向最新版本。
示例场景:
我的项目是...MyProject,我只需要来自外部存储库ExternalLibraryExternal2的几个文件。我不想在其他地方克隆每个存储库并将文件复制粘贴到我的存储库中。如果我改进了MyProject/scripts/common1.js,我想将其推送回ExternalLibrary
``` MyProject/ ├── index.html ├── scripts/ │ ├── mycode.js │ ├── otherplugin.js │ ├── common1.js <-- 来自ExternalLibrary │ └── plugin2.js <-- 来自ExternalLibrary └── styles/ ├── mystyle.css └── common.css <-- 来自External2
ExternalLibrary/ ├── common1.js ├── plugin1.js ├── plugin2.js └── bunchofothercrap...
External2/ ├── common.css └── bunchofothercrap... ```

相关参考:


这个解释看起来很有前途... https://dev59.com/KE3Sa4cB1Zd3GeqPtj0J?rq=1 - drzaus
5
看一下子模块。 - Martin Green
@MartinshShaiters,我刚刚发现了一些东西,这让我得出了那个结论。 - drzaus
这可能非常接近我的问题:https://dev59.com/mXI-5IYBdhLWcg3wMFMf - drzaus
也许这就是答案?我需要再仔细阅读一下... https://dev59.com/9W855IYBdhLWcg3wvXDd#4170965 - drzaus
请查看git子模块或git子树(两者都是本地git命令)。 - Sardaukar
1个回答

18

Git没有支持在远程项目中挑选特定文件的功能。你可以使用子树(subtree)挑选出你想要的文件,然后想办法将其重新集成到项目中,但通常这种方法过于复杂,特别是当你决定添加一些原本没有选择的文件时。

我通常会使用符号链接(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> 命令。

注意:您可以在不使用单独的分支的情况下完成大部分操作。使用最适合您的方式即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接