我已将Git存储库(包含多个子模块)移动到本地磁盘上的另一个目录。任何git命令都会产生错误:
fatal: Not a git repository: <absolute path to .git/modules/*>
错误源自在各个地方编码的文件的绝对路径[1]。两个问题:
谢谢!
<小时/>
我注意到,对于所有子模块,.git
文件包含:
gitdir: <absolute path to repository>
每个子模块中的core.worktree
参数(.git/modules/*/config
)设置为该子模块的绝对路径。
我不是在寻找一个shell命令,而是一个原生的Git方法。
我不确定绝对路径是使用较旧版本的Git创建的,而较新版本是否采用了相对路径。
答案 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%确定它在所有情况下都能正常工作,所以要小心并采取合理的预防措施!
答案 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 存储库对其进行了测试,该存储库不仅具有子模块,甚至还有子模块的子模块,并且它按预期工作。为了确保它在不写入文件的情况下检测到正确的路径,您可以通过将 >
替换为 .
(或其他一些没有特殊含义的符号)来执行“试运行”。如果一切正常,则使用 >
实际写入更改。