如何在批处理文件中执行多个git命令而不在第一个命令后终止?

Pok*_*Pok 57 windows git batch-file

我尝试将一系列GIT命令作为批处理文件连续使用,这样我就不会重复太多了.例如,我有update_repo_branch.bat一个调用此批处理文件来更新本地存储库并与远程分支同步一个分支:

@echo off
if(%1)==()goto end
if if(%2)==()goto end
cd%1
git checkout%2
git fetch origin
git merge oring /%2
:end

很好是懒惰,但我发现当GIT命令完成时,它似乎发送一个退出标志以终止正在运行的任何东西.因此,使用批处理文件一次性完成它们只是不起作用.任何想法如何解决它?

Mic*_*urr 69

我不确定所有Windows git包是否都适用,但至少有些人使用git.cmd脚本作为实际git可执行文件的包装器(例如git.exe).因此,当您的批处理文件使用git命令时,Windows实际上正在运行另一个批处理文件.

不幸的是,当一个批处理文件调用另一个批处理文件时,默认情况下它会"跳转"到调用的批处理文件,永远不会返回(这是为了兼容古老的MS-DOS命令处理器或其他东西).

您可以通过以下几种方式解决此问题:

  1. git使用call命令调用批处理文件以运行git.cmd批处理文件并返回到您的批处理文件:

    call git checkout %2
    call git fetch origin
    rem etc...
    
    Run Code Online (Sandbox Code Playgroud)
  2. git.exe显式中使用扩展名调用批处理文件,以git.cmd完全避免批处理文件.为了实现这一点,您可能需要确保按照git.exe预期的方式设置路径和其他环境变量(这似乎是git.cmdmsysgit中的内容):

    git.exe checkout %2
    rem etc...
    
    Run Code Online (Sandbox Code Playgroud)

  • 因为`call`对正常程序没有任何意外,这实际上是完全避免这种情况的好方法,无论他们使用什么`git`(甚至不知道有那么多). (5认同)
  • +1。OP描述的行为很可能证实了git确实是一个批处理脚本这一事实。一个exe程序几乎不会表现出这种行为。我同意Joey的观点,即使程序确实是一个“ exe”,“ CALL”也不会有害。 (2认同)
  • 你用你的解决方案解开了我的心!非常感谢! (2认同)