2016-04-06 13 views
0

私はgit rebase -iを定期的に使用しています。プロセスを高速化する方法を見つけたいと思っていました。対話型リベースを使わずにgit commitをリベースして編集することはできますか?

たとえば、私のgitの履歴で2番目に新しいコミットを編集したいとします。 私が使用することができますリベースできます

git rebase edit HEAD~2 

git rebase -i HEAD~2 

を...そして「E」にコミットすると私は同じような何かを行うことができることを好むだろう

を保存する設定この方法で使用されますか?

答えて

1

git rebase -iという異なるエディタを呼び出すため、直接書くことはできませんが、これを行うスクリプトを書くことができます。より正確には、最初pickコマンドセットにシーケンスエディタを呼び出し、その後、あなたがeditまたはrewordのいずれかにpickを変更したため、ファイルのためのコアエディタを起動します。

したがって、シーケンスエディタを通常の対話型エディタとは異なるコマンドに設定することで、対話型リベースを通常よりも少なくすることができます。

シーケンスエディタは、$GIT_SEQUENCE_EDITORgit config --get sequence.editor)の場合、または標準のフォールバックを使用する場合は$GIT_SEQUENCE_EDITORから取得されます。コアエディタは、$GIT_EDITORgit config --get core.editor)または標準のフォールバックを使用する場合は取得されます。

標準のフォールバックは、$VISUALを使用する場合、またはそれが設定されていない場合、$EDITORを使用するか、それが設定されていない場合、コンパイル時にデフォルト(しばしばviまたはvim)を使用します。すべて一緒にこれを置く(およびgit-sh-setupからのビットを使用して)

は、私がコミット(修正しない)言い替えるに次の完全にテストされていないスクリプトを書きました。コミットの修正(編集)を可能にするために、それをどのように修正するかは明白です。

#! /bin/sh 
# 
# git-reword: use git rebase -i to reword one particular commit 

SUBDIRECTORY_OK=Yes 
USAGE="<commit>" 

. $(git --exec-path)/git-sh-setup 

case $# in 
1) ;; 
*) usage;; 
esac 

rev=$(git rev-parse "$1") || exit 1 
# We now know which commit to reword; find it relative to HEAD, 
# and find the parent argument to pass to "git rebase -i". 

# If we wanted to allow multiple rewords we would need to sort 
# them topologically so as to find the correct parent argument. 
# "git rev-list --no-walk --topo-order <rev> <rev> ..." can do this 
# now, but watch out, older rev-lists do not apply the sort if there 
# are specific revisions listed on the command line. 

if ! git merge-base --is-ancestor $rev HEAD; then 
    fatal "$1 is not an ancestor of HEAD, cannot reword by rebasing" 
fi 
# Is it the root commit? Are there merges between it and HEAD? 
if parent=$(git rev-parse -q --verify ${rev}^); then 
    # it has a (first) parent, so don't need --root 
    nmerge=$(git rev-list --count --merges $parent..HEAD) 
else 
    # it has no first parent, so use --root instead 
    parent="--root" 
    nmerge=$(git rev-list --count --merges HEAD) 
fi 

# Refuse to run if there are merges. This is partly a matter 
# of taste since we could attempt to combine -i and -p (since 
# we are not deleting any pick lines) but it's definitely safer 
# to refuse to re-do merges: we don't know if there are evil 
# merges, for instance, nor want to force manual re-merges. 

if [ $nmerge -gt 0 ]; then 
    [ $nmerge -gt 1 ] && msg="are $nmerge merges" || msg="is a merge" 
    fatal "Cannot reword: there $msg in the way." 
fi 

require_clean_work_tree "reword" "Please commit or stash them." 

# If we allowed merges, the pick line we want might not be 
# the very first pick command; but we don't, so it is, so 
# that makes our "editor" pretty easy. 

# If we want to allow multiple reword hashes, change this 
# to write a script that reads each line and matches SHA-1s 
# (we need to expand them a la git-rebase--interactive and 
# then match them against the IDs we'd like to reword). 

TF=$(mktemp) 
trap "rm -f $TF" 0 1 2 3 15 
cat <<END> $TF 
#! /bin/sh 
# change first line from "pick ..." to "reword ..." 
# copy the remaining lines unchanged 
sed -e '1s/^pick/reword/' 
END 
chmod +x $TF 
GIT_SEQUENCE_EDITOR=$TF git rebase -i $parent