se7*_*7en 7 git bash escaping git-alias
我正在尝试编写一个git别名,从提交消息中删除字符串"[ci skip]"(放在消息的末尾),但是我遇到了转义问题.别名从作为参数传递的提交中获取所有提交HEAD
.
如果我运行以下命令:
git filter-branch -f --msg-filter "sed -e \"s/\[ci skip\]$//g\"" master..HEAD
Run Code Online (Sandbox Code Playgroud)
它按预期工作.无论如何,如果我创建以下别名:
unwip = !sh -c 'git filter-branch -f --msg-filter \"sed -e \\\"s/\[ci skip\]$//g\\\"\" $0..HEAD'
Run Code Online (Sandbox Code Playgroud)
我运行git unwip master
它抱怨错误的配置,但我希望它的行为与以前的commads一样.我怎样才能解决这个问题?
Tom*_*ale 12
通用解决方案
获取git
别名以正确传递解析器可能是一组令人难以置信的\\\\"
噪音,所以我创建了两个别名:
# Quote / unquote a sh command, converting it to / from a git alias string
quote-string = "!read -r l; printf \\\"!; printf %s \"$l\" | sed 's/\\([\\\"]\\)/\\\\\\1/g'; printf \" #\\\"\\n\" #"
quote-string-undo = "!read -r l; printf %s \"$l\" | sed 's/\\\\\\([\\\"]\\)/\\1/g'; printf \"\\n\" #"
Run Code Online (Sandbox Code Playgroud)
这允许您将可以键入的任何内容转换为sh
+,例如:
$ echo '\"'
Run Code Online (Sandbox Code Playgroud)
\"
进入适合别名的带引号的字符串:
$ git quote-string
echo '\"'
Run Code Online (Sandbox Code Playgroud)
"!echo '\\\"' #"
为了引用一个多行字符串,我写了一个更长的脚本,我建议你运行:
git quote-string |
sponge
回答OP的具体问题
使用git quote-string
OP的命令,我得到:
"!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"
因此,使用OP的首选别名,下[alias]
中~/.gitconfig
,添加:
unwip = "!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"
Run Code Online (Sandbox Code Playgroud)
调试
有时很高兴看到引擎盖下发生的事情.试试这个别名:
debug = "!set -x; GIT_TRACE=2 GIT_CURL_VERBOSE=2 GIT_TRACE_PERFORMANCE=2 GIT_TRACE_PACK_ACCESS=2 GIT_TRACE_PACKET=2 GIT_TRACE_PACKFILE=2 GIT_TRACE_SETUP=2 GIT_TRACE_SHALLOW=2 git"
Run Code Online (Sandbox Code Playgroud)
只要插入debug
之间git
以及任何通常会遵循,例如用于OP的问题:
git debug unwip
+
git
用于/bin/sh
执行以!
*开头的别名.要解决此问题,请创建一个命令行,如:bash -c 'echo \\\"'
然后将其传递给git quote-string
.
*
请参阅"调试"标题以获取证据
编辑此解决方案并不适用于所有情况。这是一个适用于所有情况的正确解决方案。
我用作bash
命令行,以下别名对我有用:
unwip = "!f() { git filter-branch --msg-filter 'sed -e "s/[ci skip/]$/g"' $1..HEAD ; }; f"
Run Code Online (Sandbox Code Playgroud)
唯一的缺点是您指定解释器并始终使用sh
. 就我而言,我依赖于用户的外壳。尽管我不相信这在任何主要 shell 中都会成为问题,因为我们只是做基本的事情。
归档时间: |
|
查看次数: |
2278 次 |
最近记录: |