62

以下を行うことは可能ですか?

  1. ファイルに出力してエディターgit rebase --interactiveで開くのではなく、標準のボイラープレートをファイルに出力するようにします。
  2. ユーザーがファイルを編集できるようにします。
  3. git rebase編集したファイルの名前でユーザーが再実行できるようにします。
  4. 通常のリベース プロセスを続行します。

ユースケース: もちろん、スクリプト化されたリベース。たとえば、Git でコミットを非対話的に並べ替える方法を参照してください。

4

10 に答える 10

63

考えて調査した結果、答えは些細なことであることが判明しまし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>単一の引数を受け入れる必要があります: 標準のリベース コミット リストを含むファイルへのパスです。その場で書き換えて終了する必要があります。その後、通常のリベース処理が行われます。

于 2012-09-12T19:31:40.790 に答える
18

@pfalcon の回答に加えて、sed を GIT_SEQUENCE_EDITOR として使用できます。たとえば、各コミットを編集したかったので、次のようにしました。

GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i
于 2013-03-13T19:36:48.083 に答える
9

この変数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ん) 。rfsdgit

それに基づいて、このタスクを自動化するスクリプトを作成しました。

#!/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
于 2013-10-09T08:45:52.320 に答える
3

インタラクティブ モードでは、セット エディターが表示されます。
使用中のエディターは、次の方法で取得できます。

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"
于 2012-09-12T19:33:02.633 に答える
-1

Jezz の回答に基づいて、シェルに依存しないスクリプト ( GitReb ) を作成しました。これは、複数引数のリビジョン、 :/<text>構文、ルート コミットで動作し、いくつかのサニティ チェックも行います。

また、よりシンプルにして、t/splitアクションとdelete-> dropIMO がこのスクリプトの範囲外である変換を削除しました。

于 2017-02-23T08:20:14.203 に答える