私の問題の全体像:
私がするスクリプトを書きたい歴史に変更に最後のn個のコミットのを今日たとえば、:./myscript.sh 5
変更された日付コミットへの最後の5つのコミットの今日。
このリンクから、私は次のいずれかを行うことができます。
私が欲しいのは、1つだけでなく最後のn個のコミットの履歴を変更することなので、3番目の手法を使用する必要がありgit rebase -i
ます。これを呼び出して、エディターを開く必要があります。このタスクを自動化するスクリプトを書きたいと思います。
タスクが手動で実行される方法は次のとおりです(最後の5つのコミットのコミット日を今日に変更します):
git rebase -i HEAD~5
次に、エディターを開きます
pick 81888d1 committed 9 months ago
pick 7363124 committed a month ago
pick eea43f7 committed yesterday
pick 48c3e85 committed yesterday
pick a62cbec commit recently
# change all the `pick` to `edit`
エディターを閉じ、以下を5回繰り返します
GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
git rebase --continue
完了。
制約:エディターで行う部分はすべてのpick
キーワードをに置き換えることであることが事前にわかっているためedit
、サイレントに実行する必要があります。入力するだけで./myscript.sh 5
ジョブが完了し、エディターは開かれません。どうすればこれを(スクリプトで)行うことができますか?
答えの助けを借りて、これが私の最後のスクリプトです:
#!/bin/bash
# wish design:
#./myscript.sh [number of days]
#./myscript.sh 5 # make the last 5 commits's commit dates to today
declare -r integer_pattern="^[0-9]+$"
if [[ $1 =~ $integer_pattern ]]; then
count=$1
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i "HEAD~$count"
for ((i=0; i<count; i++)); do
GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
git rebase --continue
done
else
echo "invalid argument [number of days] $1"
fi
ここで説明されているように。
インタラクティブリベース$EDITOR
は、コミットリストのデフォルトを開きます。と呼ばれるGIT_SEQUENCE_EDITOR
環境変数でオーバーライドすることもできるため、呼び出しをインターセプトして、この変数をスクリプトで使用する必要があります
実行:GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
。あなたは<script>
、標準的なリベースコミットリストを含むファイルへのパス:単一の引数を受け入れる必要があります。インプレースで書き換えて終了する必要があります。その後、通常のリベース処理が行われます。
例:
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i
ただし、代わりにbash / python / whateverスクリプトを使用することもできます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加