9

コミット メッセージから文字列 "[ci skip]" (メッセージの末尾に配置) を削除する git エイリアスを作成しようとしていますが、エスケープに問題があります。エイリアスは、引数として に渡されたものからすべてのコミットを取得しHEADます。

次のコマンドを実行すると:

git filter-branch -f --msg-filter "sed -e \"s/\[ci skip\]$//g\"" master..HEAD

期待どおりに動作します。とにかく、次のエイリアスを作成すると:

unwip = !sh -c 'git filter-branch -f --msg-filter \"sed -e \\\"s/\[ci skip\]$//g\\\"\" $0..HEAD'

実行git unwip masterすると、構成が悪いと不平を言いますが、以前のコマンドと同じように動作することを期待しています。どうすればこれを修正できますか?

4

2 に答える 2

22

一般的なソリューション

パーサーを正しく渡すためのエイリアスを取得するgitことは、気が遠くなるような\\\\"ノイズのセットになる可能性があるため、2 つのエイリアスを作成しました。

# 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\" #"

shこれにより、入力できるものはすべて+に変換できます。たとえば、次のようになります。

$ echo '\"'

\"

エイリアスに適合する引用符で囲まれた文字列に:

$ git quote-string
echo '\"'

"!echo '\\\"' #"

複数行の文字列を引用するために、より長いスクリプトを作成しました。次のように実行することをお勧めします。

git quote-string |sponge

OPの特定の問題への回答

git quote-stringOPのコマンドを使用すると、次のようになります。

"!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"

したがって、OP の優先エイリアス名を使用するには、 in の下[alias]に以下を~/.gitconfig追加します。

unwip = "!git filter-branch -f --msg-filter \"sed -e \\\"s/\\[ci skip\\]$//g\\\"\" master..HEAD #"

デバッグ

時々、ボンネットの下で何が起こっているかを見るのはいいことです。このエイリアスを試してください:

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"

debugの間に挿入するだけgitで、OPの質問など、通常続くものは何でも:

git debug unwip


+ git*/bin/shで始まるエイリアスを実行するために使用します。これを回避するには、次のようなコマンド ラインを作成し、これを に渡します。!bash -c 'echo \\\"'git quote-string

*証拠については、「デバッグ」の見出しを参照してください

于 2016-09-21T12:30:16.350 に答える