git: symlink/reference to a file in an external repository
git: symlink/reference to a file in an external repository
在git中是否有可能有一个“链接”到git仓库中的特定文件?就像git子模块对于文件夹的作用一样,但我的问题是关于一个特定的文件,而不是整个目录:\n
my-project/ class1.java class2.java logback.xml (链接到一个特定的文件,比如https://github.com/theHilikus/JRoboCom/blob/master/jrobocom-core/src/main/resources/logback.xml)
\n所以可以看到,在这种情况下,有一个整个子模块文件夹是没有意义的,只有一个文件。
\n我可以接受链接被锁定到一个特定的提交,但如果它在自己项目的生命周期中发生变化时可以移动,那就更好了。\n需要注意的是,这与文件系统的符号链接无关;我说的是对另一个项目、仓库、分支或其他任何东西中文件的引用。如果文件的内容是一个重复而不是文件系统符号链接,那也没问题。
git: symlink/reference to a file in an external repository
近年来,有一个名为DVC的工具,它可以让你在远程存储中进行git版本管理或链接任何类型的文件。该工具有其独立于平台的方式来链接文件。
在使用git进行版本控制时,有时候我们需要引用外部仓库中的文件。然而,git并不直接支持在一个仓库中引用另一个仓库中的文件。这就意味着我们无法直接通过git的命令来处理这种情况。
为了解决这个问题,我们可以使用名为DVC的工具。DVC是一个独立的工具,它可以与git配合使用,允许我们在一个仓库中引用另一个仓库中的文件。DVC提供了一种平台无关的方式来链接文件,使得我们可以跨仓库引用文件,并且可以在版本控制中对其进行追踪。
要使用DVC,我们首先需要安装它。可以通过访问DVC的官方网站(https://dvc.org)来获取安装说明和相关文档。
安装完成后,我们可以通过以下方式来链接外部仓库中的文件:
1. 在本地仓库中创建一个链接文件(symlink),指向外部仓库中的文件。可以使用以下命令来创建链接文件:
dvc add --external
2. 将链接文件加入到git的版本控制中:
git add.dvc
3. 提交并推送这些改动到git仓库:
git commit -m "Add symlink/reference to external file" git push
这样,我们就成功地在本地仓库中创建了一个指向外部仓库中文件的链接。通过DVC的版本控制功能,我们可以对这个链接进行追踪和管理,确保在不同的版本之间,链接指向的文件始终保持一致。
总结一下,使用DVC工具可以很好地解决git无法直接引用外部仓库中文件的问题。通过创建链接文件并将其加入到git版本控制中,我们可以在一个仓库中引用另一个仓库中的文件,并且可以对其进行版本追踪和管理。这为我们处理跨仓库文件引用的情况提供了一种简单而有效的解决方案。
Git: 引用外部存储库中的文件的符号链接的问题
Git通过默认尝试存储符号链接而不是跟随它们(为了紧凑性和一般人们的期望)来处理符号链接。当你检出包含符号链接的树时,它会将对象恢复为符号链接,而不管目标文件系统对象是否存在。
然而,如果你使用的是不支持符号链接的文件系统(如FAT),而你的存储库使用了符号链接,你可以将core.symlinks配置变量设置为false,这样符号链接就会被检出为包含链接文本的小型纯文本文件。
这个问题的标题和内容清楚地表明要求只使用远程存储库中的单个文件,并明确指出类似于git子模块但只针对单个文件。因此,Git可以很好地处理符号链接,只要所有开发人员使用的操作系统支持它们。
解决方法是设置core.symlinks配置变量为false,这样符号链接就会以纯文本文件的形式被检出。
参考资料:
[How does git handle symbolic links?](https://stackoverflow.com/questions/954560)
[Git - how to handle symlinks](https://stackoverflow.com/questions/15465436)
[How can I get git to follow symlinks?](https://stackoverflow.com/questions/86402)
git:符号链接/对外部存储库中文件的引用
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 >= 1.7.9.5,找到了另一种解决方案,使用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),并构建一个更全面的脚本来遍历所有引用并下载相应的文件。
我猜这在Windows上不会起作用,因为使用了符号链接?或者有没有Windows的解决方法?
当克隆存储库时,bootstrap.sh是否会被执行?
我试图使用git协议获取单个文件,存储库在github上。目前不支持对github服务器使用git archive。一个替代方法是使用svn,如stackoverflow.com/a/18324428/999165中所述。