基本上我在尝试用别名:

git files 9fa3

...执行命令:

git diff --name-status 9fa3^ 9fa3

但是git似乎没有将位置参数传递给alias命令。我试过:

[alias]
    files = "!git diff --name-status $1^ $1"
    files = "!git diff --name-status {1}^ {1}"

...还有一些其他的,但都没有成功。

简并的情况是:

$ git echo_reverse_these_params a b c d e
e d c b a

...我该怎么做呢?


当前回答

你要找的别名是:

files = "!git diff --name-status \"$1\"^ \"$1\" #"

参数验证:

files = "!cd -- \"${GIT_PREFIX:-.}\" && [ x$# != x1 ] && echo commit-ish required >&2 || git diff --name-status \"$1\"^ \"$1\" #"

最后一个#很重要——它防止shell处理所有用户提供的参数(它将它们注释掉)。

注意:git将所有用户提供的参数放在命令行的末尾。要查看此操作,请尝试:GIT_TRACE=2 git files a b c d

转义(由于嵌套)引号对于包含空格或“;”Rm -rf——no-preserve-root /;)

其他回答

我想用一个别名这样做:

git checkout $1;
git merge --ff-only $2;
git branch -d $2;

最后,我创建了一个名为git-m的shell脚本,内容如下:

#!/bin/bash -x
set -e

#by naming this git-m and putting it in your PATH, git will be able to run it when you type "git m ..."

if [ "$#" -ne 2 ]
then
  echo "Wrong number of arguments. Should be 2, was $#";
  exit 1;
fi

git checkout $1;
git merge --ff-only $2;
git branch -d $2;

这样做的好处是它更容易读懂,因为它是多行。另外,我喜欢用-x和-e调用bash。您可能可以使用别名来完成整个操作,但它将非常难看,并且难以维护。

因为文件名为git-m,你可以这样运行它:git m foo bar

如上Drealmer所述:

“小心,!”将在存储库的根目录下运行,因此在调用别名时使用相对路径将不会得到预期的结果。- Drealmer 13年8月8日16:28»

GIT_PREFIX被git设置为你所在的子目录,你可以通过首先改变目录来规避这个问题:

git config --global alias.ls '!cd “${GIT_PREFIX:-.}”;ls -al'

shell函数可以帮助实现这一点:

[alias]
    files = "!f() { git diff --name-status \"$1^\" \"$1\"; }; f"

一个没有别名的!被视为Git命令;例如:commit-all = commit-a。

使用!,它在shell中作为自己的命令运行,允许您使用像这样更强大的魔法。

乌利希期刊指南 因为命令是在存储库的根目录下执行的,所以在命令中引用文件名时可以使用${GIT_PREFIX}变量

你也可以直接引用sh(而不是创建一个函数):

[alias]
        files = !sh -c 'git diff --name-status $1^ $1' -

(注意行末的破折号——你会需要的。)

你要找的别名是:

files = "!git diff --name-status \"$1\"^ \"$1\" #"

参数验证:

files = "!cd -- \"${GIT_PREFIX:-.}\" && [ x$# != x1 ] && echo commit-ish required >&2 || git diff --name-status \"$1\"^ \"$1\" #"

最后一个#很重要——它防止shell处理所有用户提供的参数(它将它们注释掉)。

注意:git将所有用户提供的参数放在命令行的末尾。要查看此操作,请尝试:GIT_TRACE=2 git files a b c d

转义(由于嵌套)引号对于包含空格或“;”Rm -rf——no-preserve-root /;)