Git 具有可用于实现所需功能的功能。它支持文件系统符号链接并支持子模块。子模块已经是处理对其他存储库的引用的标准方法。您可以将它们与本地引用文件的方式结合使用。这可以使用相对符号链接直接处理,也可以使用脚本间接处理,该脚本将文件从子模块复制到您需要它们的位置。
每个外部 git 树应该有一个子模块,并且应该小心对待这些子模块,因为它们不仅是指向外部存储库的链接,而且是指向它们特定提交的链接。以下解决方案将向您展示如何使用外部存储库中的单个文件,但仍保持子模块的所有优点。
另一种方法是直接获取文件,但是您将完全失去子模块的优势,或者您必须自己构建功能。正如我已经说过的,子模块是处理此类任务的标准方法,除非您有特殊需要,例如不惜一切代价避免下载其他文件,否则您应该使用它。
使用子模块和符号链接
准备好子模块后,您只需添加指向子模块目录结构的文件系统符号链接。
在项目目录的 shell 中运行它:
$ git submodule add https://github.com/theHilikus/JRoboCom
$ ln -s JRoboCom/jrobocom-core/src/main/resources/logback.xml
$ git add .gitmodules logback.xml
$ git commit -m "add a symbolic link to logback.xml with the respective submodule"
现在你有一个符号链接:
logback.xml -> JRoboCom/jrobocom-core/src/main/resources/logback.xml
使用子模块和脚本
作为替代方案,您可以使用从子模块中复制普通文件的自定义脚本。在非常特殊的情况下,您可以在没有子模块的情况下从脚本处理外部存储库,但我通常不推荐它。
创建一个包含以下内容的文件bootstrap.sh
:
#!/bin/sh
git submodule init
git submodule update
cp JRoboCom/jrobocom-core/src/main/resources/logback.xml .
在项目目录的 shell 中运行它:
$ git submodule add https://github.com/theHilikus/JRoboCom
$ git add .gitmodules bootstrap.sh
$ git commit -m "add a script to fetch logback.xml from the respective submodule"
请注意,我们没有将logback.xml
文件添加到 Git,因为它将从子模块中获取。
指示存储库的用户首先运行上面的脚本。它将准备他们的存储库以使用子模块,将获取子模块数据并将文件复制到其位置。有时项目中已经有某种引导脚本。
使用脚本通过 git 协议获取单个文件
使用git archive
.
创建一个文件 bootstrap.sh,其中包含:
#!/bin/sh
git archive --remote=https://github.com/theHilikus/JRoboCom master:JRoboCom/jrobocom-core/src/main/resources logback.xml | tar -x
在项目目录的 shell 中运行它:
$ git add bootstrap.sh
$ git commit -m "add a script to fetch logback.xml directly from the remote project"
使用脚本通过 HTTP 获取单个文件
如果存储库托管服务还通过 HTTP 提供单个文件,您可以简单地使用curl
或wget
下载它们。
创建一个文件 bootstrap.sh,其中包含:
#!/bin/sh
curl -O https://raw.githubusercontent.com/theHilikus/JRoboCom/master/jrobocom-core/src/main/resources/logback.xml
在项目目录的 shell 中运行它:
$ git add bootstrap.sh
$ git commit -m "add a script to fetch logback.xml directly from github"
关于获取单个文件的脚本的说明
您还可以将引用存储在具有特定扩展名(如*.url
)的文件中,或在一个文件中维护引用列表(如.references
在您的项目目录中),并构建一个更全面的脚本来遍历所有引用并下载相应的文件。