Git 子模块检出分支(如果不存在),然后切换到另一个分支

Dmi*_*sev 1 git bash git-submodules

我想要这样的东西:

git submodule foreach --recursive git checkout some_feature_branch || git checkout develop
Run Code Online (Sandbox Code Playgroud)

所以如果some_feature_branch存在的话我想检查一下develop。是否可以使用内置gitbash命令来实现?

tor*_*rek 8

请记住,它将git submodule foreach其参数传递给 shell,因此您所要做的就是提供正确的 shell 命令。但是,如果您在shell(命令行解释器)中输入命令,则shell会决定您的意思。命令:

\n
foo some bars || raz a matazz\n
Run Code Online (Sandbox Code Playgroud)\n

意味着, 对于 shell:

\n
    \n
  1. 尝试去一些酒吧
  2. \n
  3. 如果成功,则停止;否则,尝试消灭马塔兹
  4. \n
\n

这不是你想要的。您希望git submodule 自己尝试git checkout,如果失败,您希望git submodule\xe2\x80\x94 而不是您的主 shell\xe2\x80\x94 继续执行git checkout. 也就是说,你不想要:

\n
    \n
  1. 对于所有子模块,尝试 git checkout
  2. \n
  3. 如果成功,则停止;否则尝试一个 git checkout
  4. \n
\n

你要:

\n
    \n
  1. 对于所有子模块:\n
      \n
    • 尝试 git checkout
    • \n
    • 如果成功,则继续下一个子模块;如果失败,请尝试另一个 git checkout,然后继续下一个子模块
    • \n
    \n
  2. \n
\n

所以那是:

\n
git submodule foreach "git checkout a || git checkout b"\n
Run Code Online (Sandbox Code Playgroud)\n

这里的双引号(尽管单引号也可以)保护||以便顶级shell不会尝试将其解释为:

\n
(git submodule foreach git checkout a) || (git checkout b)\n
Run Code Online (Sandbox Code Playgroud)\n

相反,顶级 shell 将整个“git checkout a || git checkout b”部分传递给命令git submodule foreach。该命令\xe2\x80\x94然后git submodule foreach将 \xe2\x80\x94 传递给一个为一个子模块git checkout a || git checkout b运行的命令行解释器。然后继续下一个子模块。git submodule foreach

\n

(请注意,这与 Git 本身关系不大:它是基本的shell编程。shell 是运行 shell 程序的解释器,您需要学习为其编写程序。)

\n