当我在我的仓库上运行git status时,我得到fatal: Not a git repository: /my repo/.git/modules/docs
我已经检查过.git并且包含具有适当权限的HEAD。我可以运行各种其他命令。如果我运行git gui它打开正常,将列出一些已更改的文件,但是缺少很多文件。
我猜测HEAD可能存在某种腐败现象,但不确定。知道如何在不消除整个回购的情况下解决这个问题吗?
更新:我意识到我已经更改了repo目录的名称。错误中引用的目录是目录的旧名称。所以我当前的回购是/new dir/.git
,但错误是Not a git repository: /old dir/.git/modules/docs
。也许git很困惑?
答案 0 :(得分:81)
这两个文件包含绝对子模块路径:
{submodule}/.git
.git/modules/{submodule}/config
因此,如果移动了repo,这两个文件中的绝对路径无效,并导致'not a git repository'错误。只需手动修复这些文件。
答案 1 :(得分:37)
以前版本的git使用绝对路径来定位子模块的gitdir。解决方案如下:
rm -rf broken_submodule_folder
git submodule update
。您应该看到要检出的子模块。答案 2 :(得分:8)
我最终解释说问题是由于其中一个子模块出现问题。只需重命名repo目录就会导致与该子模块发生冲突。在How can I rename a git repository with submodules?中看到讨论之后,我意识到克隆repo是一种更好的方法,而不是重命名目录并解决了子模块的问题。
答案 3 :(得分:5)
我通过使用
重置所有git-submodules解决了这个问题rm -rf .git/modules
git submodule update --init
答案 4 :(得分:4)
关注@ ax003d answer,您可以使用以下命令将所有旧路径(old/path
)替换为新路径(new/path
):
find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \) -print0 | xargs -0 sed -i -e "s#old/path#new/path#g"
您可能想要在替换它们之前检查旧路径的样子:
find . -type f \( -name ".git" -o \( -path "*.git/modules/*" -name config \) \) -print0 | xargs -0 grep --colour "old/path"
答案 5 :(得分:3)
在我的情况下,问题是.git / HEAD文件没有指向任何地方,它只包含一系列奇怪的字符。我将.git / ORIG_HEAD的内容复制到了.git / HEAD,然后再次运行。
答案 6 :(得分:1)
我也遇到了子模块这个问题,但在分析了两个文件之后
{子模块} /。GIT中 的.git /模块/子模块/子模块{} /配置
我意识到在我的情况下,这不是问题。
经过一番研究后我发现在我的情况下我必须添加git(命令:module add git)并且错误消失了。
答案 7 :(得分:0)
解决方案:
1)查看HEAD文件(在.git下)-> 如果它已损坏(包含一些随机值),请用此文本替换内容 'ref:refs / heads / develop'(develop是我正在处理的最后一个分支)
2)尝试-git状态。
3)如果第2步不能解决您的问题,请尝试使用这些命令(可能不适用于所有命令,但值得一试)
rm -f .git / index git reset
4)git将在重置后为您提供未暂存的文件。 根据您的意愿保留或丢弃