mrw*_*ter 214 git git-submodules
我刚刚运行了一个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
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我如何解决它?
Von*_*onC 252
正如Mark Longair的博客文章Git Submodules Explained所述,
版本1.7.0及更高版本的git包含git子模块行为的恼人变化.
如果子模块有任何已修改的文件或未跟踪的文件,则它们现在被认为是脏的,而之前只有在子模块中的HEAD指向错误的提交时才会出现这种情况.
+git子模块输出中加号()的含义已经改变,第一次遇到这个问题需要花一点时间来弄清楚出了什么问题,例如查看更改日志或在git上使用git bisect .git找到变化.对于用户来说,为"在指定的版本中引入不同的符号,但是很脏"会更加友好.
您可以通过以下方式修复:
在返回到父repo之前提交或撤消每个子模块中的更改/演变(其中diff不应再报告"脏"文件).要将子模块的所有更改撤消到子模块cd的根目录中,请执行此操作git checkout .
dotnetCarpenter 评论你可以做一个:git submodule foreach --recursive git checkout .
或添加--ignore-submodules到您的git diff,暂时忽略那些"脏"子模块.
正如Noam 在下面评论的那样,这个问题提到,自从git 1.7.2版以来,你可以忽略脏子模块:
git status --ignore-submodules=dirty
Run Code Online (Sandbox Code Playgroud)
use*_*907 19
同时删除子模块然后运行git submodule init,git submodule update显然会做到这一点,但可能并不总是合适或可能.
Ral*_*gen 16
不幸的是,似乎没有配置选项使"git diff --ignore-submodules"和"git status --ignore-submodules"成为全局默认值(但另请参阅在命令上设置git default flags).但是,您可以设置默认ignore您要忽略(适用于每个个体子模块配置选项git diff和git status)时,无论是在.git/config文件(仅限本地)或.gitmodules(将git的进行版本).例如:
[submodule "foobar"]
url = git@bitbucket.org:foo/bar.git
ignore = untracked
Run Code Online (Sandbox Code Playgroud)
ignore = untracked忽略未跟踪的文件,ignore = dirty也忽略修改的文件,并ignore = all忽略提交.显然没有办法为所有子模块添加通配符.
git submodule foreach --recursive git checkout .
Run Code Online (Sandbox Code Playgroud)
这对我来说不起作用,但是它给了我一个文件列表(在我的情况下只有一个)在子模块中已被更改(没有我在那里做任何事情).
所以我可以转到子模块,git状态显示我的HEAD已分离 - > git checkout master,git status再次查看修改后的文件,git checkout> filename <,git pull,一切都很好.
要忽略任何子模块中的所有未跟踪文件,请使用以下命令忽略这些更改。
git config --global diff.ignoreSubmodules dirty
Run Code Online (Sandbox Code Playgroud)
它将在本地git config中添加以下配置选项:
[diff]
ignoreSubmodules = dirty
Run Code Online (Sandbox Code Playgroud)
可以在这里找到更多信息
如果启用了文件模式设置并且您更改了子模块子树中的文件权限,则子模块可能会被标记为脏.
要禁用子模块中的filemode,可以编辑/.git/modules/path/to/your/submodule/config并添加
[core]
filemode = false
Run Code Online (Sandbox Code Playgroud)
如果要忽略所有脏状态,可以ignore = dirty在/.gitmodules文件中设置属性,但我认为最好只禁用filemode.
我最终删除了子模块目录并再次初始化它
cd my-submodule
git push
cd ../
rm -rf my-submodule
git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89789 次 |
| 最近记录: |