如何在batch file中执行多个git命令,而不是在第一个命令之后终止?
我试图把一系列的GIT命令连续地作为batch file使用,这样我就不会再重复自己了。 例如,我有这个名为update_repo_branch.bat
batch 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命令处理器兼容)。
你可以用几种方法解决这个问题:
-
使用
call
命令在batch file中调用git
来运行git.cmd
batch file并返回给你:call git checkout %2 call git fetch origin rem etc...
-
在batch file中使用
.exe
扩展名明确调用git
以避免git.cmd
batch 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中使用它。