【问题标题】:git alias to delete local and remotegit alias 删除本地和远程
【发布时间】:2013-05-20 08:49:35
【问题描述】:

我正在尝试编写一个别名来同时删除本地和远程分支,但我无法弄清楚为什么语法不起作用。在~/.gitconfig 中,我尝试了以下别名,但每个别名都产生相同的结果,这是出乎意料的:

[alias]
     nuke = !sh -c 'git branch -D $1 && git push origin :$1'

和

[alias]
     nuke = !git branch -D $1 && git push origin :$1

两者都产生:

$> git branch
  * master
  mybranch
$> git nuke mybranch
Everything up-to-date
$> git branch
  * master
  mybranch

切换命令的顺序会产生不同的结果,但也不完全是我想要的:

[alias]
    nuke = !git push origin :$1 && git branch -D $1

...

$> git branch
  * master
  mybranch
$> git nuke mybranch
Everything up-to-date
Deleted branch mybranch (was d719895)
$> git branch
  * master
$> git push origin :mybranch
To git@github.com:biegel/repo.git
 - [deleted]         mybranch

当我直接在 shell 上运行该命令时,它运行良好:

$> git branch
* master
  mybranch
$> git branch -D mybranch && git push origin :mybranch
Deleted branch mybranch (was d719895
To git@github.com:biegel/repo.git
 - [deleted]         mybranch
$> git branch
* master

我尝试在~/.bashrc 中创建别名,使用git push origin --delete $1 并使用带有!f() { }; 的shell 函数,但似乎没有任何效果!

我准备放弃了。对我在这里缺少什么有什么想法吗?

谢谢。

【问题讨论】:

    标签: git shell command alias git-alias


    【解决方案1】:

    您可以很好地完成这项工作。您只需要在定义的末尾添加一个缺失的“-”。 '-' 将向 bash 发出信号,表明所有选项处理已完成,之后的任何内容都将成为您可以通过 $1、$2 等引用的参数:

    [alias]
         nuke = !sh -c 'git branch -D $1 && git push origin :$1' -
    

    从命令行,切换到另一个分支,然后运行命令:

    git nuke branch-name
    

    或者……如果您由于某种原因无法将上述内容添加到您的.gitconfig 文件中,但可以访问.bashrc、.bash_profile 等……您可以添加以下内容:

    git config --global alias.nuke '!sh -c "git branch -D $1 && git push origin :$1" -'
    

    【讨论】:

      【解决方案2】:

      如果您创建一个名为git-nuke 的bin 并将其放在$PATH 上的任意目录中,您将获得相同的效果。这种方法的优点是能够以更清晰和稳健的方式编写命令。

      例如,在我的 bash 个人资料中,我有:export PATH="$HOME/.bin:$PATH"。

      在~/.bin/git-nuke,我有:

      #!/bin/bash
      set -eu
      
      #
      # git nuke <branch-name>
      #
      # Delete a branch (irrespective of its merged status) and
      # remove from origin.
      #
      
      echo "Nuking $1 ..."
      
      if git show-branch "$1" > /dev/null 2>&1
      then
        git branch -D "$1"
      else
        echo "No local branch to delete"
      fi
      
      git remote prune origin
      if git show-branch "origin/$1" > /dev/null 2>&1
      then
        echo "Deleting remote $1 ..."
        git push origin ":$1"
      else
        echo "No remote branch to delete"
      fi
      

      【讨论】:

      • 这样做的另一个好处是您可以添加自动补全。
      • 我可以让 git 作为一个新的子命令 nuke 来完成它,就好像它被定义为别名一样,还是我必须输入 git-nuke?在壳里?
      • git-mycmd 技巧意味着您现在有一个mycmd 子命令,将通过git mycmd 调用,并且使用git my[tab] 完成制表符完成工作
      【解决方案3】:

      您不能在别名中使用$1。在路径中的某处创建一个名为 git-nuke 的脚本,以便您可以访问正确的 shell 脚本。

      您也可以只安装git-extras。这是一个包含 git delete-branch 脚本的脚本编译,它完全符合您的要求。

      【讨论】:

      • 啊,谢谢指点。我可能会选择 git-extras。
      • 请参阅jszakmeister's answer,您可以在别名中使用$1。
      • 虽然 jszakmeister 的回答确实是一个不错的解决方案,但您仍然不能在别名中使用 $1。 sh 正在那里进行 $1 处理。别名的参数总是附加到它上面。
      猜你喜欢
      • 2021-08-22
      • 2011-01-01
      相关资源
      最近更新 更多