我尝试将一系列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命令完成时,它似乎发送一个退出标志以终止正在运行的任何。因此,使用批处理文件一次性完成它们只是不起作用。知道怎么解决它吗?
答案 0 :(得分:67)
我不确定所有Windows git包是否都适用,但至少有一些使用git.cmd
脚本作为实际git可执行文件的包装(例如git.exe
)。因此,当您的批处理文件使用git
命令时,Windows实际上正在运行另一个批处理文件。
不幸的是,当一个批处理文件调用另一个批处理文件时,默认情况下它会“跳转”到调用的批处理文件,永远不会返回(这是为了与古老的MS-DOS命令处理器或其他东西兼容)。
您可以通过以下几种方式解决此问题:
使用git
命令在批处理文件中调用call
来运行git.cmd
批处理文件并返回给您:
call git checkout %2
call git fetch origin
rem etc...
使用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
此命令将有效地将所有本地跟踪分支与远程分支同步。
了解更多信息,请点击此处: