以下を行うことは可能ですか?
- ファイルに出力してエディター
git rebase --interactive
で開くのではなく、標準のボイラープレートをファイルに出力するようにします。 - ユーザーがファイルを編集できるようにします。
git rebase
編集したファイルの名前でユーザーが再実行できるようにします。- 通常のリベース プロセスを続行します。
ユースケース: もちろん、スクリプト化されたリベース。たとえば、Git でコミットを非対話的に並べ替える方法を参照してください。
以下を行うことは可能ですか?
git rebase --interactive
で開くのではなく、標準のボイラープレートをファイルに出力するようにします。git rebase
編集したファイルの名前でユーザーが再実行できるようにします。ユースケース: もちろん、スクリプト化されたリベース。たとえば、Git でコミットを非対話的に並べ替える方法を参照してください。
考えて調査した結果、答えは些細なことであることが判明しましgit rebase -i
た。よく知られている EDITOR/VISUAL 環境変数からエディター名を取得するため、それをオーバーライドして非対話型スクリプトを指すようにします。
ただし、EDITOR/VISUAL は、コミットのリスト、言い換え時のコミット メッセージなどに無差別に適用されます。したがって、http://git.kernel.org/?p=git /git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd 、コミットリストにのみ適用される特別な環境変数 GIT_SEQUENCE_EDITOR があります。
したがって、コミットの順序を変更またはフラット化するためのレシピは次のとおりです。
実行: GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
. <script>
単一の引数を受け入れる必要があります: 標準のリベース コミット リストを含むファイルへのパスです。その場で書き換えて終了する必要があります。その後、通常のリベース処理が行われます。
@pfalcon の回答に加えて、sed を GIT_SEQUENCE_EDITOR として使用できます。たとえば、各コミットを編集したかったので、次のようにしました。
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i
この変数GIT_SEQUENCE_EDITOR
は、最初はエディターを変更するために使用されました。この変数にスクリプトを渡してgit rebase -i
、非対話的な方法で使用することができます。したがって、次を使用できます。
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick 134567/e 1234567/'" git rebase -i 1234567^
このコマンドはsed
、 によって提供されたファイルに対して実行されますgit rebase -i
。行が次のように変更pick 134567
されますe 1234567
(したがって、コミット 1234567 を編集します)。(rework) 、(fixup)、(squash)、または(drop) で変更できます (後者は古いバージョンの ではサポートされていませe
ん) 。r
f
s
d
git
それに基づいて、このタスクを自動化するスクリプトを作成しました。
#!/bin/bash
ACTION=$1
COMMIT=$(git rev-parse --short $2)
[[ "$COMMIT" ]] || exit 1
CORRECT=
for A in p pick r reword e edit s squash f fixup d drop t split; do
[[ $ACTION == $A ]] && CORRECT=1
done
[[ "$CORRECT" ]] || exit 1
git merge-base --is-ancestor $COMMIT HEAD || exit 1
if [[ $ACTION == "drop" || $ACTION == "d" ]]; then
GIT_SEQUENCE_EDITOR="sed -i -e '/^pick $COMMIT/d'" git rebase -i $COMMIT^^
elif [[ $ACTION == "split" || $ACTION == "t" ]]; then
GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/edit $COMMIT/'" git rebase -i $COMMIT^^ || exit 1
git reset --soft HEAD^
echo "Hints:"
echo " Select files to be commited using 'git reset', 'git add' or 'git add -p'"
echo " Commit using 'git commit -c $COMMIT'"
echo " Finish with 'git rebase --continue'"
else
GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/$1 $COMMIT/'" git rebase -i $COMMIT^^
fi
最初の引数は 1 つのアクションでなければなりません。このスクリプトは、git-rebase と同じアクション名を使用します。また、「分割」アクションを追加します (drop
古いバージョンの git で使用できるようにします)。
また、要求するコミットが HEAD の祖先であることも確認します。これは、 でよくある (そして本当に厄介な) 間違いrebase -i
です。
2 番目の引数は、編集/削除/分割/言い換えたいコミットです。
次に、エイリアスを .gitconfig に追加します。
[alias]
autorebase = ! path_to_your_script
インタラクティブ モードでは、セット エディターが表示されます。
使用中のエディターは、次の方法で取得できます。
git config --get core.editor
したがって、非対話型エディター (標準入力でコマンドを受け入れるエディター) を設定すると、非対話型の方法で作業できます--interactive
:)コマンドを確実に受け入れることは
わかっていますし、もちろん標準エディターもそうです。vim
ed
そのため、対話型エディターを保持します (必要な場合)
$ ied="$(git config --get core.editor)"
非対話型エディターを設定する
$ git config --unset-all core.editor
$ git config --add core.editor ed
そしてそれを使って作業してください..
$ printf '%s\n' "some-ed-cmd" "another-ed-cmd" "wq" | git rebase -i HEAD~5
エディターを復元します(必要な場合)
$ git config --unset-all core.editor
$ git config --add core.editor "$ied"