【问题标题】:How do I execute several git commands in a batch file without terminating after the first command?如何在批处理文件中执行多个 git 命令而不在第一个命令之后终止?
【发布时间】: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

标签: windows git batch-file


【解决方案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 命令处理器或其他东西兼容)。

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

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

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

        git.exe checkout %2
        rem etc...
        

      【讨论】:

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