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

68

我尝试将我经常使用的一系列GIT命令作为批处理文件连续放置在一起,以便不重复太多。例如,我有一个名为update_repo_branch.bat的批处理文件,用于更新本地repo并将分支与远程分支同步:

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

懒惰是好的,但我发现GIT命令完成后,似乎会发送一个退出标志来终止正在运行的任何内容。因此,使用批处理文件一次性执行所有命令并不起作用。有什么办法可以解决这个问题吗?


那么,只执行 git checkout 命令吗? - eckes
4个回答

84

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

不幸的是,当一个批处理文件调用另一个批处理文件时,默认情况下它会跳转到被调用的批处理文件,而不会返回(这是为了与古老的MS-DOS命令处理程序兼容或其他原因)。

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

  1. 在批处理文件中使用call命令调用git.cmd批处理文件并返回:

    call git checkout %2
    call git fetch origin
    rem etc...
    
  2. 在批处理文件中使用 .exe 扩展名明确调用 git,以避免完全使用 git.cmd 批处理文件。 为使其正常工作,您可能需要确保已按照 git.exe 需要的方式设置了路径和其他环境变量(这似乎是 msysgit 中 git.cmd 所做的)。

  3. git.exe checkout %2
    rem etc...
    

6
由于call在正常程序中不会有任何意外情况,这实际上是一个完全避免这种情况的好方法,无论他们使用哪个版本的git(甚至不知道有那么多版本)。 - Joey
2
+1. OP所描述的行为很可能证实了git确实是一个批处理脚本。不太可能期望一个exe程序表现出那样的行为。我同意Joey的观点,即使该程序最终被证明是一个exe,使用CALL也不会有任何损害。 - Andriy M
2
你的解决方案打开了我的心扉!谢谢你无数次! - Basil Musa

4
假设您使用msysGit作为Git客户端,您可能实际上想要使用Bash脚本来完成此操作。您可以将bash函数放置在~/.bashrc中(~通常是您的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中使用它。

2
根据您的示例,我看到您实际上正在尝试将本地分支“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的跟踪分支,那么你只需要在仓库中执行以下命令:
git pull

这条命令会有效地将你的所有本地跟踪分支与远程分支同步。
更多信息请参见此处: Git拉取文档 Git远程分支和跟踪分支(Progit书籍)

0

创建一个记事本文件,将以下内容粘贴并保存为 .bat 扩展名。

此脚本可用于在项目中首次设置 git。

!echo off
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin <YOUR_REPO_URL>
git push -u origin main
pause

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接