【问题标题】:"git push origin master" gives weird behavior in bash script“git push origin master”在 bash 脚本中给出了奇怪的行为
【发布时间】:2019-12-20 06:50:10
【问题描述】:

我的 bashrc 文件中有这个简单的函数

function aupgrade {
    cat ~/.bash_aliases > ~/bash/.bash_aliases
    cd ~/bash
    git add .

    if [[ $1 == "" ]]; then
        git commit -m "Update"
    else
        git commit -m "$1"
    fi

    git push origin master

    cd - 1>/dev/null
}

这个函数是有目的的,这是预期的行为:

首先,将bash仓库中.bash_aliases文件的内容替换为cat ~/.bash_aliases的stdout

第二,进入~/bash目录,这是一个git存储库

第三,暂存所有变化

第四,如果在调用aupgrade函数时,下面的参数是空的,只需提交“更新”消息,但如果用户写了一个参数,如aupgrade "New commit!",则提交随着消息等参数的变化,git commit -m $1

第五,推送改动

第六次,回到上一个目录

但是,它不这样做,而是这样做:

首先,将bash仓库中.bash_aliases文件的内容替换为cat ~/.bash_aliases的stdout

其次,进入~/bash目录,这是一个git存储库

第三,暂存所有变化

第四,尽管有参数,但提交“更新”消息

第五,推送改动

第六次,回到上一个目录

这很奇怪。这看起来是git push origin master 线的产品。这不是一个条件问题,因为当我编写另一个这样的函数但没有 git push origin master 行时,它可以正常工作。

为什么会这样?有什么解决办法吗?

这就是 set -x 显示给我的,真的很奇怪

【问题讨论】:

  • 我可以推荐简化if吗?请改用git commit -m "${1:-Update}"
  • if [[ $1 == "" ]]; then 更改为 if [[ "$1" == "" ]]; then 有帮助吗?这是基于shellcheck's 建议:双引号以防止通配符和分词
  • 调试 shell 脚本和函数的一般有用技巧:set -x。现在,shell 在执行每个命令时打印(到 shell 的 stderr)。 (set +x 清除标志。)
  • !! 正在通过历史扩展扩展为 set -x,因为它位于双引号中,并且这是一个交互式 shell。
  • @MartínNieva,您从 git 获得的错误与是否从脚本调用程序无关,而是与您尝试推送的提交是否是当前远程头的子项有关。当您需要在远程 master 之上合并或 rebase 时,该错误是完全正常的。

标签: bash git


【解决方案1】:

所以我已经测试了你的代码,我能发现的唯一问题是,将你的第一个参数作为带有多个感叹号的字符串传递会插入相同的(或上一个?)命令,除非你对其进行转义:

看起来这正是发生在你身上的事情,但你事先运行了“set -x”,因此它用该命令替换了双感叹号。

我还建议将函数参数存储在命名的局部变量中以使代码更简洁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2021-04-13
    • 2015-12-08
    • 2017-09-21
    • 2022-08-18
    • 2012-09-09
    • 2011-08-07
    相关资源
    最近更新 更多