Git - 如何处理符号链接

时间:2013-03-17 19:52:32

标签: git

在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域目录,其中包含应用程序中的所有核心代码。此外,还有一个供应商目录,其中包含符号链接到主应用程序目录并因此集成的模块。

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

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

3 个答案:

答案 0 :(得分:131)

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

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

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

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

但是,在创建它们时,一定要将它们创建为相对符号链接而不是绝对符号链接,这样无论克隆存储库的位置如何,它们都能正常工作。最简单的方法是将目录更改为Modules目录并从那里创建符号链接:

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

答案 1 :(得分:10)

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

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

因此,为你的案例存储在git下版本化的符号链接应该没有任何害处。

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

答案 2 :(得分:1)

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

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

我需要git版本控制中的那些文件夹,没有它的内容。

在网络服务器(相同的版本控制)上,这些文件夹看起来像这样(符号链接):

  • app / media / bla =>完全不管其他地方
  • app / media / blubb =>完全在某个地方再次

开发人员应该在他们的本地环境中使用原始版本结构,如第一步所述(无符号链接)。但是,网络服务器具有符号链接到不同的NFS系统。

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

我现在唯一的做法就是让一个构建器为本地环境创建正确/不同的结构,服务器和媒体子文件夹目前完全由gitignore忽略。但这有时候很棘手/难以维持。