26

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

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

示例场景

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

  1. 我的项目/
    • 索引.html
    • 脚本/
      • 我的代码.js
      • 其他插件.js
      • common1.js <-- 来自 ExternalLibrary
      • plugin2.js <-- 来自 ExternalLibrary
    • 款式/
      • 我的样式.css
      • common.css <-- 来自 External2
  2. 外部图书馆/
    • common1.js
    • 插件1.js
    • 插件2.js
    • 一堆杂七杂八的...
  3. 外部2/
    • common.css
    • 一堆杂七杂八的...

相关参考:

4

1 回答 1

16

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>.

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

于 2014-03-04T17:40:27.603 回答