Git-如何处理符号链接


71

在git中处理符号链接的正确方法是什么?

我有以下结构:

Vendors
  Module A
  Module B
  Module C
App
 Code
   Modules
     Core Module 1
     Core Module 2
     Module A (symlinked to vendors)
     Module B (symlinked to vendors)
     Module C (symlinked to vendors)

有一个主App目录,其中包含应用程序中的所有核心代码。此外,还有一个供应商目录,其中包含一些模块,这些模块被符号链接到主应用程序目录中并因此被集成。

重要的是,供应商目录和主应用程序目录都在同一存储库中进行版本控制。

因此,我应该让git继续存储符号链接,还是找到一种方法使其忽略符号链接?


HM我做到了相对的,它不工作在github :(你能帮帮我吗?github.com/lingohub/Example-Resource-Files/blob/master/...
贝蒂圣

您的请求是完全合理的,并且您发现了GitHub方面的封装违规行为。符号链接是存储层的详细信息-我想在哪里将各种文件夹物理保留在不同的卷上?GitHub只应关注文件系统导航层:如果某事物看起来和行为类似于子目录,则将其视为一个(鸭子输入),而不会通过向下窥视以查看它是否是另一个卷的符号链接而过度规范用户。不。
Canuck

Answers:


136

只要所有开发人员使用的操作系统都支持,符号链接就可以很好地处理符号链接。由于您依赖于显示这些符号链接,因此我假设您的开发环境都支持符号链接。

要确定是否应该在git存储库中包含某些内容(符号链接或其他),请考虑以下事项:

  • 它是由存储库中的某些工具或其他过程生成的文件吗?如果是这样,最好忽略它,让每个用户生成文件,以便他们始终拥有最新版本。
  • 该文件是特定于特定用户的开发环境还是在所有环境中都使用的文件?如果它是特定用户环境的怪癖,例如忽略Emacs备份文件的配置,则它不属于存储库。如果这是所有开发人员都需要的东西,和/或构建用于生产的应用程序所需的东西,则应将其放入存储库中。

在您的情况下,似乎没有生成符号链接,并且在所有环境中都需要它们,因此将它们放在存储库中应该没问题。

但是,在创建它们时,请确保将它们创建为相对符号链接,而不是绝对符号链接,以便无论克隆存储库的位置如何,它们都将起作用。最简单的方法是将目录更改为Modules目录,并从此处创建符号链接:

cd App/Code/Modules
ln -s "../../../Vendors/Module A" "Module A"

HM我做到了相对的,它不工作在github :(你能帮帮我吗?github.com/lingohub/Example-Resource-Files/blob/master/...
贝蒂圣

这是否意味着如果我在供应商/模块A中进行了任何更改,并将其推送到Git,那么Git将自动更新App / Code / Modules / Module A的内容?
HasnainMamdani

3
使用该-r选项创建相对的符号链接ln -r -s /path/to/target
Fred Schoen

1
确保您的git config没有symlinks = false。如果您是从Windows或TortiseGit复制存储库,则可能会发生这种情况。
phyatt

11

就像版本控制中的任何其他文件一样,Git存储符号链接-除了符号链接,它只会存储有关符号链接到的路径的信息,并且将文件类型存储为符号链接,而不是常规文件。

如果符号链接指向目录,则git不会将内容存储在符号链接目录下。

因此,为您的情况存储在git下版本化的符号链接不会有任何危害。

使用符号链接还需要注意的一件事是,git只会在新的克隆上重新创建符号链接,而不是它指向的文件或目录。符号链接路径可能不存在(例如,使用绝对路径时)。


1
有没有一种方法可以添加符号链接目录中的文件?
kraftydevil

2
@kraftydevil-git仅在symlink本身的目标目录受git版本控制时,才允许您在symlink目录下添加文件。否则git将不会(也不应)对symlink目录的内容进行版本控制。如果您试图对git仓库主目录之外的symlink目录下的文件进行版本控制,那么您就在做错什么。您可能想签出git submodules(或更好git subtrees)。
Tuxdude

我将我的Jenkins实例置于源代码控制之下。我想为每个作业保留lastSuccessful构建内容。稍后我会对其进行详细说明。
kraftydevil

@Tuxdude请参阅stackoverflow.com/questions/15465436/git-how-to-handle-symlinks/…(由于字符过多,因此无法将其发布为注释)。
ioCron

1

@Tuxdude完全不同意“ ...那么您做错了什么”。例如,如果您需要将媒体文件夹放置在Web服务器或NFS上的其他驱动器上,则必须将其放置在版本控制之外。因此,符号链接的媒体文件夹中的内容将无法通过版本控制访问,如您所解释。但这是您必须那样做的情况。这真的很痛苦...我的情况更加复杂(我将不做详细介绍),我实际上要寻找的是将symlinked文件夹的子文件夹添加到版本控制中,但不添加其内容,但是我需要有一个选项,可以忽略git中子文件夹类型本身的任何更改。例如,基本结构:

  • 应用/媒体/ bla
  • 应用程序/媒体/ blubb

我需要git版本中的那些文件夹,而不包含其内容。

在网络服务器上(相同版本),这些文件夹如下所示(符号链接):

  • app / media / bla =>完全不在其他地方
  • app / media / blubb =>完全不在其他地方

开发人员应在其本地环境中仅具有第一步中说明的原始版本化结构(无符号链接)。但是Web服务器具有指向不同NFS系统的符号链接。

如果有人知道如何解决这个问题,我将非常感激,因为我还没有找到任何解决方案。

我现在要做的唯一方法是拥有一个为本地环境创建正确/不同结构的生成器,并且gitignore当前完全忽略服务器和媒体子文件夹。但这有时可能很棘手/难以维护。


1
这是一个常见问题,正如我之前所说,它与版本控制无关。一种解决方案是拥有一个初始化脚本,以根据目标环境设置符号链接。应该运行初始化脚本来引导您的设置git clone。将初始化脚本添加到git的版本控件中。BTWgit不会对空目录进行版本控制,git仅对文件进行版本控制并且知道路径。当您运行任何git命令时,这将用于重新创建目录结构。
Tuxdude

感谢您的解释,实际上几乎与我在当前设置中所做的完全一样。我只是认为可能会有一种“更舒适”的方式。如果git在gitignore规则等中的普通文件和符号链接之间具有某种区分标志,那么某些事情至少会容易一些。这就是为什么我认为与“版本控制”有关,它可能被实现为“新功能” /通过功能请求,因此,当涉及到更复杂的内容时,我在git中也缺少一些其他内容场景。
ioCron

1
我实际上可以说为什么git用这种方式对待符号链接。对于git,symlink等效于文本文件,其内容表示symlink的目标。当您将符号链接添加到git中时,此目标将作为git历史的一部分添加。
Tuxdude
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.