我刚刚运行了一个git diff,我得到以下输出的所有我的大约10个子模块

diff --git a/.vim/bundle/bufexplorer b/.vim/bundle/bufexplorer
--- a/.vim/bundle/bufexplorer
+++ b/.vim/bundle/bufexplorer
@@ -1 +1 @@
-Subproject commit 8c75e65b647238febd0257658b150f717a136359
+Subproject commit 8c75e65b647238febd0257658b150f717a136359-dirty

这是什么意思?我该怎么解决呢?


当前回答

你对你的回购有足够的权限吗?

我的解决方案与git无关,但是我看到了相同的错误消息,以及子模块的脏状态。

根本原因是。git文件夹中的一些文件是root拥有的,所以git没有写访问权,因此git不能改变子模块的脏状态时,我的用户运行。

你也有同样的问题吗?

从存储库的根文件夹中,使用find列出根目录下的文件[可选]

find .git -user root

解决方案(Linux)

将.git文件夹中的所有文件更改为您的所有者

sudo chown -R $USER:$USER .git

# alternatively, only the files listed in the above command...
sudo find .git -user root -exec chown $USER:$USER {} +

这是怎么发生的?

在我的例子中,我在docker容器的子模块中构建了库,docker守护进程传统上以root身份运行,因此创建的文件属于root:root所有权。

我的用户通过代理通过该服务拥有根权限,所以即使我没有做任何事情,我的git存储库仍然有根拥有的更改。

我希望这能帮到某人,离开这里。

其他回答

检查子模块的递归性。我的问题是我的子模块错误地指向了他内部的另一个子模块。

你对你的回购有足够的权限吗?

我的解决方案与git无关,但是我看到了相同的错误消息,以及子模块的脏状态。

根本原因是。git文件夹中的一些文件是root拥有的,所以git没有写访问权,因此git不能改变子模块的脏状态时,我的用户运行。

你也有同样的问题吗?

从存储库的根文件夹中,使用find列出根目录下的文件[可选]

find .git -user root

解决方案(Linux)

将.git文件夹中的所有文件更改为您的所有者

sudo chown -R $USER:$USER .git

# alternatively, only the files listed in the above command...
sudo find .git -user root -exec chown $USER:$USER {} +

这是怎么发生的?

在我的例子中,我在docker容器的子模块中构建了库,docker守护进程传统上以root身份运行,因此创建的文件属于root:root所有权。

我的用户通过代理通过该服务拥有根权限,所以即使我没有做任何事情,我的git存储库仍然有根拥有的更改。

我希望这能帮到某人,离开这里。

要忽略任何子模块中所有未跟踪的文件,使用以下命令忽略这些更改。

git config --global diff.ignoreSubmodules dirty

它将添加以下配置选项到您的本地git配置:

[diff]
  ignoreSubmodules = dirty

更多信息可以在这里找到

在我的例子中,我不确定是什么导致了这种情况的发生,但我知道我只是想让子模块被重置到它们最新的远程提交,然后完成它。这涉及到把这里几个不同问题的答案结合起来:

Git子模块更新——递归——远程——初始化

来源:

如何将我的更改恢复到git子模块?

简单的方法拉最新的所有git子模块

我最终删除了子模块目录,并再次初始化它

cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update