2

我正在尝试编写日志别名

git config --global --replace-all alias.lol6 "! f() { echo "\$1"; git --no-pager log --oneline  --graph -15 \${@}; }; f"

并像这样使用它:

git lol5 '@{-1}'
git log '@{-1}'  #works

但是传递给 git 的 commit-ish 是 @-1

fatal: ambiguous argument '@-1': unknown revision or path not in the working tree

我读 了这篇文章,但不明白如何使用它

谢谢波阿斯

更多信息,尝试过@vonc 建议

git config --global --replace-all alias.lol6 '! f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f'

得到相同的结果,打开 GIT_TRACE

git lol6 @{-1}
20:20:37.454153 git.c:576               trace: exec: git-lol6 '@{-1}'
20:20:37.454153 run-command.c:640       trace: run_command: git-lol6 '@{-1}'
20:20:37.463150 run-command.c:640       trace: run_command: ' f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f' '@{-1}'
@-1
22:20:37.607150 git.c:344               trace: built-in: git log --oneline --graph -15 @-1
fatal: ambiguous argument '@-1': unknown revision or path not in the working tree.

Git 在第一个参数周围添加 ''

但是!!!,如果我尝试过

git lol6 HEAD
20:30:35.621257 run-command.c:640       trace: run_command: ' f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f' HEAD

Git 不会在 HEAD 周围添加 ''

4

1 回答 1

0

我更喜欢使用字符串引号'而不是双引号:在你的情况下少转义。

请参阅此示例,在 git bash 会话中完成。

vonc@voncavn7:/mnt/d/git/git$ 
git config --global --replace-all alias.lol6 \
  '! f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f'

首先,我检查我是否可以打印一个虚假的参数:

vonc@voncavn7:/mnt/d/git/git$ git config --global --replace-all alias.lol6 '! f() { echo "$1"; git --no-pager log --oneline  --graph -15 ${@}; }; f'
vonc@voncavn7:/mnt/d/git/git$ git lol6 e
e
fatal: ambiguous argument 'e': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

然后我尝试调用别名时不带任何引号:git lol6 @{-1}

vonc@voncavn7:/mnt/d/git/git$ git lol6 @{-1}
@{-1}
* 29533fb168 (tmp2) RelNotes: the eleventh batch
*   dc8fb4dd7e Merge branch 'rb/quick-install-doc'
|\
| * 65289e9dcd install-doc-quick: allow specifying what ref to install

如果上面的别名/命令不起作用,请始终使用简化的 PATH仔细检查:

set G=c:\path\to\latest\git
set PATH=%G%\bin;%G%\usr\bin;%G%\mingw64\bin
set PATH=%PATH%;C:\windows\system32;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\

OP Boaz Nahum在评论中证实:

使用'simplified PATH' - 它有效。
现在是什么意思?为什么它有效?

它之所以有效,是因为不知道原始 PATH 中的内容,C:\Windows\System32以及放置Git 之前的其他文件夹中的内容,并掩盖了一些 Git 可执行文件。

我怎样才能使标准的 Git 安装工作呢?

只需将c:\path\to\latest\git上面替换为您自己的 Git 当前安装路径。

然后设置你的PATH

set PATH=%G%\bin;%G%\usr\bin;%G%\mingw64\bin

接下来,将所有其他文件夹从您的原始文件夹中添加%PATH%,并始终C:\windows\system32;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\.
这样,你:

  • 从最具体的(Git: git/bin, git/usr/bin, git/ming64/bin)开始,确保 Git 按预期工作
  • 继续使用更通用的应用程序路径(原始路径中的路径)
  • 以最通用的 PATH 结尾:操作系统 Windows 的(C:\windows\system32\...那些)

通过从最具体到最一般,您可以降低已安装软件的“意外行为”率。

于 2018-06-01T15:42:38.917 回答