51

在 git 中是否有可能在 git repo 中拥有指向特定文件的“链接”?就像 git submodules 对文件夹所做的那样,但我的问题是关于一个特定的文件,而不是一个完整的目录:

my-project/
    class1.java
    class2.java
    logback.xml (link to a particular file, say https://github.com/theHilikus/JRoboCom/blob/master/jrobocom-core/src/main/resources/logback.xml)

可以看出,在这种情况下,拥有一个完整的子模块文件夹是没有意义的,它只是一个文件。
我可以将链接锁定到特定提交,但如果它在自己的项目生命周期中发生变化时移动会更好

注意,这与文件系统的符号链接无关;我说的是对另一个项目、repo、分支或任何东西中的文件的引用。如果文件的内容是重复的而不是文件系统符号链接,那没关系

4

4 回答 4

56

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 提供单个文件,您可以简单地使用curlwget下载它们。

创建一个文件 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在您的项目目录中),并构建一个更全面的脚本来遍历所有引用并下载相应的文件。

于 2015-01-04T21:18:31.313 回答
3

接受的答案似乎具有误导性,因为只要所有开发人员使用的操作系统都支持,Git 就可以很好地处理符号链接。

Git 默认尝试存储符号链接而不是跟随它们(为了紧凑性和人们通常想要的)。

当您检出包含链接的树时,无论目标文件系统对象是否存在,它都会将该对象恢复为符号链接。

如果您在不支持符号链接的 FAT 等文件系统上,并且您的存储库使用它们,您可以将 core.symlinks 配置变量设置为 false,并且符号链接将作为包含链接文本的小型纯文本文件检出。

所以参考:

git 如何处理符号链接?

Git - 如何处理符号链接

如何让 git 遵循符号链接?

于 2015-01-04T20:22:28.613 回答
0

晚了几年,但看看DVC工具,它允许你 git 版本跟踪或链接存储在远程存储中的任何类型的文件。该工具具有独立于平台的文件链接方式。

于 2021-12-17T15:09:55.473 回答
-2

很不幸的是,不行。您可以在 git 中拥有的唯一外部引用类型是通过子模块,它将整个分支放在一个目录中。您需要创建一个脚本或其他东西来帮助从所需位置获取文件并将其放入您的工作树中。

于 2013-04-05T23:11:33.617 回答