git:symlink /对外部存储库中文件的引用

时间:2013-04-05 22:16:39

标签: git

git中是否可以在git repo中为特定文件提供“链接”?就像git子模块对文件夹所做的那样,但我的问题是关于特定文件,而不是完整目录:

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,branch或任何东西中的文件的引用。如果文件的内容是重复的而不是文件系统符号链接

,则没问题

3 个答案:

答案 0 :(得分:35)

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 protocol

获取单个文件

使用git archive找到Git> = 1.7.9.5的另一个解决方案。

创建一个包含以下内容的文件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)并构建更全面的脚本它遍历所有引用并下载相应的文件。

答案 1 :(得分:0)

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

默认情况下,Git会尝试存储符号链接而不是跟随符号链接(对于紧凑性以及通常人们想要的内容)。

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

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

SO参考文献:

How does git handle symbolic links?

Git - how to handle symlinks

How can I get git to follow symlinks?

答案 2 :(得分:-2)

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

相关问题