如何在batch file中执行多个git命令,而不是在第一个命令之后终止?

我试图把一系列的GIT命令连续地作为batch file使用,这样我就不会再重复自己了。 例如,我有这个名为update_repo_branch.batbatch file来更新本地存储库,并与远程分支同步一个分支:

@echoclosures
如果(%1)==()转到了结尾
如果(%2)==()转到结尾
cd%1
git结帐%2
git获取原点
混帐合并/%2
:结束

很好很懒,但是我发现, 当一个GIT命令完成时,它似乎发回退出标志来终止正在运行的任何东西 。 因此,使用batch file来一次性执行它们根本不起作用。 任何想法如何解决它?

我不确定这是否适用于所有Windows git包,但至less有一些使用git.cmd脚本作为实际git可执行文件(例如git.exe )的包装。 所以当你是batch file使用git命令时,Windows实际上正在运行另一个batch file。

不幸的是,当一个batch file调用另一个batch file时,默认情况下会跳转到被调用的batch file,永远不会返回(这是为了与古老的MS-DOS命令处理器兼容)。

你可以用几种方法解决这个问题:

  1. 使用call命令在batch file中调用git来运行git.cmdbatch file并返回给你:

     call git checkout %2 call git fetch origin rem etc... 
  2. 在batch file中使用.exe扩展名明确调用git以避免git.cmdbatch file。 为了这个工作,你可能需要确保你有你的path和其他环境variables设置git.exe期望方式(这似乎是什么git.cmd在msysgit中):

     git.exe checkout %2 rem etc... 

正如我从你的例子看到,你实际上是试图同步你的本地分支“branchname”与起源/ branchname

为此,你不需要任何额外的脚本,你只需要使用git pull而不是序列git checkout branchname; git fetch origin; git merge origin/branchname 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分支正在跟踪原产地/ dev1和origin / dev2的分支,那么你只需要在repository中执行:

 git pull 

这个命令将有效地同步你所有的本地跟踪分支与远程分支。

更多的在这里看到:

Git拉文档

Git远程分支和跟踪分支(Progit书)

假设你使用msysGit作为你的Git客户端,你可能真的想使用Bash脚本来做这件事情。 你可以在你的~/.bashrc一个bash函数(〜通常是你的C:\ Users \ – 见这里 )如下

 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中使用它。