Git - 如何处理符号链接

Mar*_*ace 67 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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*ins 133

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

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

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

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

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

cd App/Code/Modules
ln -s "../../../Vendors/Module A" "Module A"
Run Code Online (Sandbox Code Playgroud)

  • 高举"相对符号链接"的+1 (45认同)
  • 确保你的 git 配置没有 `symlinks = false`。如果您从 Windows 或使用 TortiseGit 复制存储库,则可能会发生这种情况。 (4认同)
  • 使用`-r`选项创建相对符号链接`ln -r -s/path/to/target` (2认同)

Tux*_*ude 11

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

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

因此,对于您的案例存储在git下版本化的符号链接应该没有任何害处.

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

  • @kraftydevil - 只要符号链接本身的目标目录在 git 版本控制之下,git 就会让你在符号链接目录下添加文件。否则 git 不会(也不应该)对符号链接目录的内容进行版本控制。如果您尝试在主 git 存储库目录之外的符号链接目录下对文件进行版本控制,那么您就做错了。你可能想查看`git submodules`(或者更好的`git subtrees`)。 (2认同)