确保相对Git路径

Gin*_*ngi 19 git git-submodules

我已将Git存储库(包含多个子模块)移动到本地磁盘上的另一个目录.任何git命令都会产生错误:

fatal: Not a git repository: <absolute path to .git/modules/*>
Run Code Online (Sandbox Code Playgroud)

该错误源自在各个地方编码的文件的绝对路径[1].两个问题:

  • 是否有用于修复这些路径的Git命令,即使它们相对?[2]
  • 有没有办法确保未来的Git存储库只使用相对路径?[3]

谢谢!


笔记

  1. 我注意到,对于所有子模块,该.git文件包含:

    gitdir: <absolute path to repository>
    
    Run Code Online (Sandbox Code Playgroud)

    core.worktree每个子模块(.git/modules/*/config)中的参数设置为该子模块的绝对路径.

  2. 我不是在寻找一个shell命令,而是一个原生的Git方法.

  3. 我不确定是否使用较旧版本的Git创建了绝对路径,而更新的路径是否采用了相对路径.

r3d*_*ey3 7

我写了一个oneliner(需要bash和coreutils),它将任何.git gitdir文件更改为相对路径:

find -type f -name .git -exec bash -c 'f="{}"; cd $(dirname $f); echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git' \;
Run Code Online (Sandbox Code Playgroud)

如果你不喜欢在这里找到一个git子模块:

git submodule foreach --recursive '[[ -f .git ]] && echo "gitdir: $(realpath --relative-to=. $(cut -d" " -f2 .git))" > .git'
Run Code Online (Sandbox Code Playgroud)


Sam*_*ane 0

我遇到了同样的问题。

这是我编写的一个小脚本的要点,可能会有所帮助。

它并没有通过将路径转换为相对形式来真正解决问题,但它确实在相关位置进行快速搜索和替换,使您可以修复所有问题。如果您正在处理一组复杂的子模块,其中可能有很多路径需要修复,则特别方便。

请注意,我自己在 OS X 10.8 上使用过此脚本,但我不能 100% 确定它在所有情况下都有效,因此请小心并采取合理的预防措施!

https://gist.github.com/3394771