确保相对Git路径

时间:2012-06-08 18:12:47

标签: git git-submodules

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

fatal: Not a git repository: <absolute path to .git/modules/*>

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

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

谢谢!

<小时/>

备注

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

    gitdir: <absolute path to repository>
    

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

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

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

4 个答案:

答案 0 :(得分:6)

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

complete(df, id, key = 1:10)

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

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

答案 1 :(得分:3)

@ r3dey3解决方案适用于 for Windows

git submodule foreach --recursive '[[ -f .git ]] && chmod +w .git && echo "gitdir: $(realpath --relative-to=. "$(cygpath -u "$(cut -d" " -f2 .git)")")" > .git'

我在这里补充道:

  • chmod +w .git删除只读属性
  • cygpath -u调用将Windows路径转换为Unix路径

答案 2 :(得分:0)

我遇到了同样的问题。

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

通过将路径转换为相对形式并没有真正解决问题,但它确实可以快速搜索和解决问题。在相关位置更换,允许您解决所有问题。如果您正在处理一组复杂的子模块,可能会有很多路径需要修复,这一点非常方便。

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

https://gist.github.com/3394771

答案 3 :(得分:0)

以下命令将所有子模块的路径转换为相对路径(即使子模块 gitdir 文件中的 .git 值错误或为空,它也能工作,因此即使将存储库移动到新位置):

for module in $(dirname $(find .git/modules -type f -name description)); do
    git="$(echo $module | cut -d/ -f2- | perl -pe "s|modules/||g")/.git"
    if [[ -e $git ]]; then
        echo "gitdir: $(realpath --relative-to=$(dirname $git) $module)" > $git
    fi
done

需要从仓库根目录(.git目录所在)执行。

我使用 PyTorch 存储库对其进行了测试,该存储库不仅具有子模块,甚至还有子模块的子模块,并且它按预期工作。为了确保它在不写入文件的情况下检测到正确的路径,您可以通过将 > 替换为 .(或其他一些没有特殊含义的符号)来执行“试运行”。如果一切正常,则使用 > 实际写入更改。