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

时间:2013-02-12 11:49:12

标签: git workflow organization

使用Git,我想在我的项目中包含一些常见的JS / CSS库和/或实用程序方法(即来自另一个repo的特定文件),我希望它们能够如此总是是最新的。我真的不想要整个远程存储库。如果我可以处理远程文件的“本地副本”并将更改重新推送,那么可以获得奖励。

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

示例场景

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

  1. MyProject的/
    • 的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 ...
  4. 相关参考资料:

1 个答案:

答案 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>

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