Git 吉特;提交除子模块更改以外的所有更改”;

Git 吉特;提交除子模块更改以外的所有更改”;,git,git-submodules,Git,Git Submodules,我通常的git工作流是 git checkout -b branch_name .... <do my thing> git commit -am 'some comment' git fetch git merge origin/develop .... <do some more things> git commit -am 'more things' git push git签出-b分支机构名称 .... git commit-am“一些评论” git获取 gi

我通常的git工作流是

git checkout -b branch_name
.... <do my thing>
git commit -am 'some comment'
git fetch
git merge origin/develop
.... <do some more things>
git commit -am 'more things'
git push
git签出-b分支机构名称
.... 
git commit-am“一些评论”
git获取
git合并源/开发
.... 
git提交-am“更多内容”
git推送
不幸的是,我正在处理的repo有子模块(我从不修改,但其他人会修改)。如果我执行上述操作,并且如果合并更新了子模块,则第二次提交会拉入子模块的旧版本,并且我的拉入请求中会出现意外的子模块更改

我知道我可以在合并后执行
git子模块更新--init--recursive
。但这很容易忘记,我并不总是想这样做(例如,当我跳转到另一个分支来更改某个内容并跳回时)

我的问题

除了提交子模块之外的所有内容的git commit-am'blahblah'之外,还有其他方法吗

我意识到我必须更新它们才能使我的代码正常工作。但我只是不想有意外犯下这些错误的问题


我还希望避免在合并/切换分支时自动更新它们,因为这会使跳转变得更慢、更麻烦。

那么,您希望执行过时的子模块签出,但添加所有其他内容?Git没有一个单字母提交选项来实现这一点,但编写脚本非常简单

git ls-files -s $(git ls-files -m) | grep -v ^16 | cut -f2-
将列出所有修改的非子模块路径,您可以添加或显式提交这些路径

所以


不管你喜欢怎么包装都应该这样做。

那么,你想进行过时的子模块签出,但添加所有其他内容?Git没有一个单字母提交选项来实现这一点,但编写脚本非常简单

git ls-files -s $(git ls-files -m) | grep -v ^16 | cut -f2-
将列出所有修改的非子模块路径,您可以添加或显式提交这些路径

所以

不管你喜欢什么,我都会做的

我知道我可以做
git子模块更新--init--recursive
。但这很容易忘记,我并不总是想这样做(例如,当我跳转到另一个分支来更改某个内容并跳回时)

您可以通过创建预提交挂钩(提交前运行的脚本)自动完成这一任务

因为这只在提交之前运行,所以您不需要考虑这一点,如果您只是切换分支等,也不会发生这种情况。但是,使用此脚本提交会更慢

为此,请导航到
.git
目录中的
hooks
文件夹

在这里,您可以创建一个名为
pre-commit
的文件,其中包含以下内容:

#/bin/bash
git子模块更新--初始化--递归
这将在提交之前自动更新该存储库中的所有子模块

这个脚本应该可以在linux和windows上运行,因为git for windows附带了bash。如果不起作用,可以尝试使用cmd/git bash的完整路径,而不是
/bin/bash
。我认为在windows上使用cmd可能会更快

如果要提交而不更新子模块,可以将
--no verify
添加到
git commit
命令中

有关详细信息,请参阅

我知道我可以做
git子模块更新--init--recursive
。但这很容易忘记,我并不总是想这样做(例如,当我跳转到另一个分支来更改某个内容并跳回时)

您可以通过创建预提交挂钩(提交前运行的脚本)自动完成这一任务

因为这只在提交之前运行,所以您不需要考虑这一点,如果您只是切换分支等,也不会发生这种情况。但是,使用此脚本提交会更慢

为此,请导航到
.git
目录中的
hooks
文件夹

在这里,您可以创建一个名为
pre-commit
的文件,其中包含以下内容:

#/bin/bash
git子模块更新--初始化--递归
这将在提交之前自动更新该存储库中的所有子模块

这个脚本应该可以在linux和windows上运行,因为git for windows附带了bash。如果不起作用,可以尝试使用cmd/git bash的完整路径,而不是
/bin/bash
。我认为在windows上使用cmd可能会更快

如果要提交而不更新子模块,可以将
--no verify
添加到
git commit
命令中

有关详细信息,请参阅