我正在尝试理解这个git命令。 我有一个软件存储库,它有子模块,子模块指向另一个子模块。为了结账,使用了这个命令 -
git submodule foreach --recursive 'git checkout master || :'
这个问题是关于理解这个命令。 什么" || :"意味着在这个命令?我问这个问题,以便我可以根据需要更灵活地更改这些命令。
在这个命令中 - foreach,找到每个子模块的意思去做并检查主人但是" ||并且:"在这里意味着。
答案 0 :(得分:3)
git submodule foreach --recursive '<command>'
这会运行<command>
in each checked out submodule。
这样就让命令本身理解:
git checkout master || :
git checkout master
应该很清楚。
||
是一个OR控制字符。对于command1 || command2
,如果command2
返回非零退出状态,则会执行command1
。所以基本上command1
失败了。
因此,在这种情况下,:
会在git checkout master
失败时运行。
另一方面,冒号是true
in Bash的别名。如此有效,此命令将不会执行任何操作,使完整命令运行git checkout master
,如果它可以或它将无声地失败。
答案 1 :(得分:1)
:
是一个shell命令,它什么也不做,总是成功(类似于true
)。所以加入
|| :
到命令行,即使||
左侧的命令失败,整个命令也会一直成功。在这种情况下,即使其中一个子模块无法结帐git submodule foreach
,也会导致master
继续。
这种用法由git文档建议:
任何子模块中命令的非零返回都会导致处理终止。这可以通过在命令末尾添加
|| :
来覆盖。
答案 2 :(得分:0)
cmd ||:
只是确保命令始终成功的一种方法。如果cmd失败,那么:
将被执行并成功,因此$?
将始终为0.所以基本上你的submodule foreach忽略了检出master的任何错误。
答案 3 :(得分:0)
来自git submodule
docs for foreach
...
任何子模块中命令的非零返回都会导致处理终止。这可以通过添加||来覆盖:到命令的末尾。
它表示即使命令在其中一个上失败,也要继续处理子模块。
如果您熟悉make
,则与putting a -
at the front of a command then make
will then ignore any errors from that command类似。
答案 4 :(得分:0)
command_a || command_b
才会使bash执行command_b(command_a会将退出代码不同的返回0)。 :
是true
的替代符号,等于退出代码0
即使git checkout master || :
失败,git checkout master
也会始终返回true。
如果其中一个子模块的结帐不成功,那么写git submodule foreach --recursive 'git checkout master'
就会中断。