基本上我在尝试用别名:
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
...我该怎么做呢?
使用git手册中描述的GIT_TRACE=1使别名处理透明:
$ git config alias.files
!git diff --name-status $1^ $1
$ GIT_TRACE=1 git files 1d49ec0
trace: exec: 'git-files' '1d49ec0'
trace: run_command: 'git-files' '1d49ec0'
trace: run_command: 'git diff --name-status $1^ $1' '1d49ec0'
trace: exec: '/bin/sh' '-c' 'git diff --name-status $1^ $1 "$@"' 'git diff --name-status $1^ $1' '1d49ec0'
trace: built-in: git 'diff' '--name-status' '1d49ec0^' '1d49ec0' '1d49ec0'
trace: run_command: 'less -R'
trace: exec: '/bin/sh' '-c' 'less -R' 'less -R'
MM TODO
你原来的命令使用git 1.8.3.4版本(Eimantas注意到这在1.8.2.1中有所改变)。
sh -c '..'——和f() {..};f选项都以不同的方式干净地处理“$@”参数(参见GIT_TRACE)。在别名后面附加“#”还可以允许位置参数,而不保留后面的参数。
你要找的别名是:
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