-s
過去にgitで行った以前のコミットをサインオフする方法を考えていましたか?
10 に答える
前のコミットをサインオフするには、amendオプションを使用します。
git commit --amend --signoff
編集:修正は最新のコミットのみをサインオフします。複数のコミットをサインオフするため、filter-branch
およびinterpret-trailers
voncet 。al。使用すべきです。これが私のために働いたものです。
まず、トークンをに置き換えるようにgitを構成しsign
ますSigned-off-by
。これは1回だけ実行する必要があり、次のステップで必要になります。
git config trailer.sign.key "Signed-off-by"
git filter-branch
スイッチを使用したコマンドは、--msg-filter
コミットごとに1回フィルターを評価します。フィルタは、stdinでコミットメッセージを受信し、stdoutで出力する任意のシェルコマンドにすることができます。独自のフィルターを作成することも、べき等git interpret-trailers
ではないを使用することもできます。これは、現在のユーザーと電子メールを使用して、現在のブランチの最新の2つのコミットを承認する例です。
export SIGNOFF="sign: $(git config --get user.name) <$(git config --get user.email)>"
git filter-branch -f --msg-filter \
"git interpret-trailers --trailer \"$SIGNOFF\"" \
HEAD~2..HEAD
注1)コミットメッセージを変更すると、コミットIDが変更されます。つまり、既に公開されているブランチをプッシュする場合は、-force-with-leaseを--force
使用するか、より適切な方法で強制する必要があります。
注2)カスタムスクリプトを作成する場合はgit filter-branch
、現在のディレクトリをに変更することに注意してください<repo>/.git-rewrite/t
。スクリプトへの相対パスの使用は通常は機能しません。代わりに、スクリプトはにある$PATH
か、絶対パスとして提供する必要があります。
これを試して、古いコミットを-S
:でやり直してください。
git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD
その後、あなたはする必要がありますgit push -f
。ただし、コミットIDが変更され、他の人が同期しなくなることに注意してください。
最近(Git 2.13以降)、一般的に次のようなことができます
git rebase --signoff HEAD~2
Signed-off-by
最後の2つのコミットにフッターを追加します(この例では)。
範囲にルートコミットが含まれている場合は、--root
オプションをに追加しますrebase
。
コミットをサインオフするためのより自動化された方法をまだ探している人がいる場合。
これを試して:
git rebase --exec 'git commit --amend --no-edit -n -S' -i commit-hash
これにより、コミットハッシュ(Xコミット)まですべてがリベースされます
次にgit push -f
、履歴の変更をリモートにプッシュバックする必要があります
私にとっては、signofを修正するだけで、実際にはgithubでコミットを検証しませんでした。
私のために働いている解決策は戻って、それから各コミットに署名します-S
git commit --amend -S
また、コミットが実際に署名されているかどうかを確認し、電子メール/名前が単に追加されていない場合は、このコマンドを使用します
git show HEAD --show-signature
追加のヒント: すでにコミットを修正している場合は、実際の名前をコミットに含めることをお勧めします(の使用を参照git log
)。githubハンドル名を使用している可能性がありますが、これは不要です。正しい電子メールのみが必要であり、ユーザー名のフィールドにはフルネームを使用する必要があります。githubはそれをgithubハンドル名で正しく追跡します。したがって、ユーザー名を修正して最後のコミットに署名するには、次のようにします。
git commit --amend --author="FULL NAME <email>" -S
また、将来的にはユーザー名のフルネームを設定します
git config --global user.name "FULL NAME"
サインオフがコミットメッセージを変更することを考慮しgit filter-branch
て、それを達成するために使用します。
git filter-branch --msg-filter \
"cat - && echo && echo 'Signed-off-by: Dan McGee <email@example.com>'" \
HEAD
(「git filter-branch
魔法」の例)
または、Curt J. Sampsonの提案に従って、以下を使用しgit interpret-trailers
ます。
git config trailer.sign.key "Signed-off-by"
git filter-branch --msg-filter \
"cat - && echo && git interpret-trailers --trailer 'sign: 'Signed-off-by: Dan McGee <email@example.com>'" \
HEAD
警告:これにより、既存のコミットのSHA1が変更され、結果を強制的にプッシュする必要がある場合があります。これは、コミットがすでに他のユーザーと共有されている場合に問題になる可能性があります。
vorburgerはコメントに例を追加します:
gitバージョン2.20.1を使用して、の「
Signed-off-by
」を省略し--trailer 'sign:
、次のようにする必要がありました。
git filter-branch --msg-filter \
"cat - && echo && git interpret-trailers --trailer 'sign: Michael Vorburger <vorburger@redhat.com>'" \
HEAD
-S
フラグを使用したインタラクティブなリベースがその役割を果たします。
最後のn個のコミットをサインオフする必要があるとしましょう(これらのn個のコミットのうち最新のものを必ずチェックアウトしてください)。
走る:
$ git rebase -S -i HEAD~n
# The `-S` flag is important.
# It tells Git to sign the following commits.
これにより、最後のn
コミットのリストが表示されます。
次に、署名するすべてのコミットのプレフィックスに変更pick
します。edit
完了したら、エディターを閉じます。新しいエディターが開き、コミットに関するすべてが表示されます。
コミットでは何も変更する必要がないため、ファイルを保存してエディターを終了します。コミットメッセージを変更することもできます。
他のコミットについてもこれを繰り返します。
最新の履歴をプッシュするには、git push remote branch -f
。
警告
1つの落とし穴があります-それはあなたのコミットを書き直すことができます。
4か月前のコミットに署名すると、日付が上書きされ、今日作成されたように見える場合があります。したがって、コミット履歴を保持したい場合はお勧めしません。
同様の問題がありました。ここで、GentooLinuxのRobinJohnsonのおかげで、以前のすべてのプッシュされていないコミットに署名を追加するトリックがあります。
$ git pull && git rebase --gpg-sign --force-rebase origin/master && git push --signed
Already up-to-date.
Current branch master is up to date, rebase forced.
First, rewinding head to replay your work on top of it...
Applying: sci-biology/KING: new package
Applying: dev-lang/yaggo: version bump, fix install procedure
Applying: sci-libs/htslib: version bump
Applying: sci-biology/bcftools: version bump
Applying: sci-biology/samtools: version bump
Applying: sci-biology/libBigWig: new release with io.h renamed to bigWigIO.h
Applying: sci-biology/MaSuRCA: add more URLs to HOMEPAGE
Applying: sci-biology/SPAdes: update comments on bundled dev-libs/boost
Applying: sci-biology/khmer: added a comment how to proceed with src_compile()
Applying: sci-biology/picard: version bump
Applying: sci-biology/ruffus: pint EGIT_REPO_URI to the archive URL of code.google.com
Applying: sci-biology/vcftools: the 0.1.15_pre release was just renamed to 0.1.15 by upstream
Applying: sci-biology/nanopolish: new package
Applying: sci-biology/libBigWig: version bump
Counting objects: 75, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (75/75), done.
Writing objects: 100% (75/75), 14.51 KiB | 0 bytes/s, done.
Total 75 (delta 55), reused 0 (delta 0)
remote: To github.com:gentoo/sci.git
remote: 29c5e3f5d..b37457700 master -> master
To git+ssh://git.gentoo.org/proj/sci.git
29c5e3f5d..b37457700 master -> master
$
履歴を書き換えない回避策:
- 新しいブランチを作成します
- 古いものからフラグを付けてマージ
--no-commit --no-ff
git reset
すべてのコミット(署名付きまたは署名なし)を削除しますgit commit -S -am "commit message"
- SIGNEDコミットを1回だけ実行して新しいブランチをプッシュします
git status
...
On branch feature/branch_unsigned_commits
...
git checkout -b feature/branch_unsigned_commits_take2
git merge --no-commit --no-ff feature/branch_unsigned_commits
git reset
git commit -S -am "commit message"
git push
最後のX回のコミットをサインオフするための迅速なソリューション。
git rebase --signoff @~X
たとえば、最後の10回のコミットをサインオフします
git rebase --signoff @~10
私の場合、これは簡単な解決策だと思いました。ソース:https ://pmhahn.github.io/git-signoff/