【问题标题】:Git - Include files from other repositoriesGit - 包含来自其他存储库的文件
【发布时间】:2014-03-05 01:40:27
【问题描述】:

使用 Git,我想在我的项目中包含一些常见的 JS/CSS 库和/或实用方法(即来自另一个 repo 的特定文件),我希望他们这样做'总是最新的。我真的不想要整个远程存储库。如果我可以处理远程文件的“本地副本”并将更改推送回去,那就太好了。

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

示例场景

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

  1. 我的项目/
    • index.html
    • 脚本/
      • mycode.js
      • otherplugin.js
      • common1.js
      • plugin2.js
    • 样式/
      • mystyle.css
      • common.css
  2. 外部图书馆/
    • common1.js
    • plugin1.js
    • plugin2.js
    • 一堆杂七杂八的...
  3. 外部2/
    • common.css
    • 一堆杂七杂八的...

相关参考资料:

【问题讨论】:

标签: git workflow organization


【解决方案1】:

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 &lt;url_to_myproject&gt;

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

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 2019-08-16
    • 2023-03-12
    • 2022-01-20
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多