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

时间:2011-03-23 05:32:32

标签: windows git batch-file

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

  

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

很善于懒惰,但我发现当GIT命令完成时,它似乎发送一个退出标志以终止正在运行的任何。因此,使用批处理文件一次性完成它们只是不起作用。知道怎么解决它吗?

3 个答案:

答案 0 :(得分:67)

我不确定所有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...
    
  2. 使用git扩展名明确调用批处理文件中的.exe,以完全避免git.cmd批处理文件。为此,您可能需要确保将路径和其他环境变量设置为git.exe期望的方式(这似乎是git.cmd在msysgit中的作用):

    git.exe checkout %2
    rem etc...
    

答案 1 :(得分:3)

假设您使用msysGit作为Git客户端,您实际上可能希望使用Bash脚本。你可以在~/.bashrc(〜通常是你的C:\ Users \ - see here)中放置一个bash函数,如下所示

update_repo_branch() {
    if [ $# != "2" ]; then
        echo "Usage: update_repo_branch REPO BRANCH" 1>&2
        return 1
    fi

    cd $1
    git checkout $2
    git fetch origin
    git merge origin/$2
}

然后,您可以从mysysGit shell运行update_repo_branch myrepo cool-branch

当然,这不能从cmd.exe访问。您只能在msysGit cygwin shell中使用它。

答案 2 :(得分:3)

正如我从您的示例中看到的,您实际上是在尝试将您的本地分支'branchname'与origin / branchname同步

为此,您不需要任何其他脚本,只需使用git pull而不是序列git checkout branchname; git fetch origin; git merge origin/branchname

查看有关跟踪git中的分支及其好处的文档。

一般来说,如果你有这样的回购布局:

git branch -a
...
master
dev1
dev2
remotes/origin/master
remotes/origin/dev1
remotes/origin/dev2

你的dev1和dev2分支相应地跟踪origin / dev1和origin / dev2的分支,然后你只需要在repository中执行:

git pull

此命令将有效地将所有本地跟踪分支与远程分支同步。

了解更多信息,请点击此处:

Git pull docs

Git remote branches and tracking branches (Progit book)