Git - 包含来自其他存储库的文件

drz*_*aus 19 git workflow organization

使用Git,我想在我的项目中包含一些常见的JS/CSS库和/或实用程序方法(即来自另一个repo的特定文件),我希望它能让它们始终保持最新状态.我真的不想要整个远程存储库.如果我可以处理远程文件的"本地副本"并将更改重新推送,则可以获得奖励.

一个有点平行的例子:在ASP.NET中,我会通过引用("远程")其他库的.dll文件(没有"copy local")来做到这一点,这样每当我重新编译外部库时,我的项目就会指向最新的版本.

示例场景

我的项目是...... MyProject,我只想要外部存储库ExternalLibraryExternal2中的几个文件.我不想在其他地方克隆每个存储库,并将文件复制粘贴到我的存储库中.如果我做了改进MyProject/scripts/common1.js,我想把它推回到ExternalLibrary.

  1. 我的项目/
    • 的index.html
    • 脚本/
      • mycode.js
      • otherplugin.js
      • common1.js < - 来自ExternalLibrary
      • plugin2.js < - 来自ExternalLibrary
    • 风格/
      • mystyle.css
      • common.css < - 来自External2
  2. ExternalLibrary /
    • common1.js
    • plugin1.js
    • plugin2.js
    • bunchofothercrap ...
  3. External2 /
    • common.css
    • bunchofothercrap ...

相关参考:

oni*_*ake 14

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
Run Code Online (Sandbox Code Playgroud)

要使符号链接在Windows中工作:

然后,在进行任何更改之前,我会创建一个新分支:

$ cd external_library
$ git checkout -b myproject
# make changes back in ../myproject
$ git commit <files> # in external_library
Run Code Online (Sandbox Code Playgroud)

然后,您可以将您的分支推送到github或其他内容,并向作者提交拉取请求,以便回复您的更改.

你可以保持这样的同步:

$ cd external_library
$ git checkout master
$ git pull
$ git checkout myproject
$ git merge master
Run Code Online (Sandbox Code Playgroud)

您还需要在子模块更改时更新父项目(例如git commit external_library).任何人使用你的项目都需要做一个git clone --recursive <url_to_myproject>.

注意:您可以在不为项目使用单独分支的情况下实现大部分此操作.使用对你最有意义的东西.

  • 当心后果:/sf/answers/66820281/ (2认同)