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

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

因此,我应该让git继续存储符号链接,或find一种方法来忽略符号链接?

只要所有开发人员使用的操作系统都支持,Git就可以处理符号链接。 既然你依赖于这些符号链接,我会假设你的开发环境都支持符号链接。

要决定是否应该包含在你的git仓库(符号链接或其他),请考虑以下几点:

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

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

但是,创build它们时,一定要将它们创build为相对符号链接而不是绝对符号链接,以便它们可以工作,而不pipe存储库的克隆位置如何。 最简单的方法是将目录切换到Modules目录并从那里创build符号链接:

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

Git存储符号链接,就像其版本控制中的任何其他文件一样 – 除了符号链接,它只会存储有关它所符合的path的信息,而文件types则是符号链接而不是常规文件。

如果符号链接指向一个目录,那么git不会将这些内容存储在symlinked目录下。

因此,在你的情况下存储在git下版本的符号链接应该没有什么坏处。

还有一件事你需要注意符号链接,git只会重新创build一个新克隆的符号链接,而不是它指向的文件或目录。 有可能symlinked的path不存在(比如使用绝对path时)。

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

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

我需要在git版本中的这些文件夹,没有它的内容。

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

  • app / media / bla =>其他地方
  • app / media / blubb =>其他地方再次

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

如果有人有一个想法如何解决这个我真的很感激它,因为我还没有find任何解决scheme呢。

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