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

Posted

技术标签:

【中文标题】如何在批处理文件中执行多个 git 命令而不在第一个命令之后终止?【英文标题】:How do I execute several git commands in a batch file without terminating after the first command? 【发布时间】:2011-07-21 01:11:16 【问题描述】:

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

@echo 关闭 if(%1) == () 转到结束 if(%2) == () 转到结束 光盘 %1 git 结帐 %2 git 获取来源 git 合并 oring/%2 :结束

懒惰是好事,但我发现当一个 GIT 命令完成时,它似乎会发送一个退出标志来终止正在运行的任何东西。因此,使用批处理文件一次性执行它们根本行不通。知道如何解决它吗?

【问题讨论】:

那么,只执行git checkout 【参考方案1】:

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

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】:

正如我从您的示例中看到的,您实际上是在尝试将本地分支“分支名称”与原点/分支名称同步

为此,您不需要任何额外的脚本,您只需要使用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 pull docs

Git remote branches and tracking branches (Progit book)

【讨论】:

【参考方案3】:

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

不幸的是,当一个批处理文件调用另一个批处理文件时,默认情况下它会“跳转”到调用的批处理文件,永远不会返回(这是为了与古老的 MS-DOS 命令处理器或其他东西兼容)。

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

    使用call 命令在批处理文件中调用git 以运行git.cmd 批处理文件并返回到您的批处理文件:

    call git checkout %2
    call git fetch origin
    rem etc...
    

    使用.exe 扩展名在批处理文件中调用git,以完全避免使用git.cmd 批处理文件。为此,您可能需要确保您的路径和其他环境变量设置为 git.exe 期望的方式(这似乎是 git.cmd 在 msysgit 中所做的):

    git.exe checkout %2
    rem etc...
    

【讨论】:

因为call 对普通程序没有任何意外,这实际上是完全避免这种情况的好方法,无论他们使用什么git(甚至不知道有那么多)。跨度> +1。 OP 描述的行为很可能证实了git 确实是一个批处理脚本的事实。 exe 程序几乎不会像这样运行。我同意乔伊的观点,CALL 不会造成伤害,即使该程序确实是 exe 你用你的解决方案解开了我的心!非常感谢!

以上是关于如何在批处理文件中执行多个 git 命令而不在第一个命令之后终止?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不在客户端安装软件的情况下从远程计算机在我的家用计算机上执行 git 命令(拉、推)?

如何获取批处理文件以执行下一个命令而无需等待

第四章 流程控制语句及第五章 用户及文件权限

为啥调用嵌套批处理文件而不在行前添加“调用”退出父批处理文件?

如何以最大输出大小压缩多个文件,同时将文件对保持在一起

git revert和git reset的区别