使用 Git,我想在我的项目中包含一些通用的 JS/CSS 库和/或实用程序方法(即来自另一个存储库的特定文件),我希望它们总是最新的。我真的不想要整个远程存储库。如果我可以处理远程文件的“本地副本”并将更改推送回去,那就更棒了。
一个有点类似的例子:在 ASP.NET 中,我会通过引用 ("remote") 其他库的 .dll
文件(没有“copy local "),这样每当我重新编译外部库时,我的项目就会指向最新版本。
示例场景
我的项目是...MyProject,我只想要来自外部存储库 ExternalLibrary 和 External2 的几个文件。我不想将每个存储库克隆到其他地方并将文件复制粘贴到我的存储库中。如果我对 MyProject/scripts/common1.js
进行了改进,我想将其推回到 ExternalLibrary。
- 我的项目/
- index.html
- 脚本/
- mycode.js
- 其他插件.js
- common1.js <-- 来自 ExternalLibrary
- plugin2.js <-- 来自 ExternalLibrary
- 样式/
- mystyle.css
- common.css <-- 来自 External2
- 外部图书馆/
- common1.js
- plugin1.js
- plugin2.js
- 一群废话...
- 外部2/
- common.css
- 一群废话...
相关引用:
- Git: how to work with multiple repositories?
- How to checkout only one file from git repository?
- Get file from other developer local GIT and add to main repository
- Can a git repository be created where branches are clones from other repositories?
- http://www.kernel.org/pub/software/scm/git/docs/gitworkflows.html
最佳答案
Git 不支持在远程项目中选择文件。您可以使用子树选择您想要的文件,然后想出某种策略将其重新放入,但这通常很复杂,尤其是当您突然决定需要比最初选择的文件更多的文件时。
我通常最终做的是使用 symlinks
.这可以通过将项目添加为项目中的子模块,然后将文件符号链接(symbolic link)到正确的位置来完成。
你的例子应该是这样的:
$ 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
要让符号链接(symbolic link)在 Windows 中工作:
- 如果您是管理员组的成员,则必须关闭 User Access Control (UAC)然后重新启动计算机。
- 如果您不是管理员,则需要获取 SeCreateSymbolicLinkPrivilege privilege
然后在您进行任何更改之前,我会去创建一个新分支:
$ cd external_library
$ git checkout -b myproject
# make changes back in ../myproject
$ git commit <files> # in external_library
然后您可以将您的分支推送到 github 或其他地方,并向作者提交 pull 请求,以便回馈您的更改。
您可以像这样保持同步:
$ cd external_library
$ git checkout master
$ git pull
$ git checkout myproject
$ git merge master
您还需要在子模块更改时更新父项目(例如 git commit external_library
)。任何使用你的项目的人都需要做一个 git clone --recursive <url_to_myproject>
.
注意:您可以在不为项目使用单独的分支的情况下实现其中的大部分。使用对您最有意义的任何内容。
关于Git - 包含来自其他存储库的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14831877/