2012-10-24 10 views
31

Ich frage mich, wie ich (-s) von früheren Commits, die ich in der Vergangenheit in git gemacht habe, unterschreiben?Git vorherige Commits abmelden?

+0

Check http://schacon.github.com/git/git-commit.html –

+0

möglich Duplikat http://stackoverflow.com/questions/1962094/what-is-the-sign-off-feature-in-git-for –

+1

Ich frage mich, ob es nicht ironisch unsicher ist, dies zu tun. Indem du dich unterzeichnest, sagst du mehr oder weniger "Ich behaupte, dass die vorherigen Commits sicher sind".Aber wenn Sie sie geklont haben usw. und Sie diese nicht wirklich überprüfen, geben Sie etwas an, das Sie nicht überprüfen können. Stellen Sie sich einen Hacker vor, der irgendwie einen Commit manipuliert. Das Unterschreiben verhindert jedoch in der Tat, dass jemand in einer späteren Phase das Commit manipuliert. Aber vielleicht sollten Sie das zur Nachricht hinzufügen? –

Antwort

46

der vorherigen begehen Um SIGNOFF verwenden ändern Option:

git commit --amend --signoff

6

Berücksichtigt Sign-Offs die Commit-Nachricht zu ändern, verwendet git filter-branch, um das zu erreichen.

git filter-branch --msg-filter \ 
    "cat - && echo && echo 'Signed-off-by: Dan McGee <[email protected]>'" \ 
    HEAD 

(zB von "git filter-branch magic")

Oder folgenden Curt J. Sampson ‚s suggestion, mit 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 protected]>'" \ 
    HEAD 

Vorbehalt: dies die SHA1 Ihrer bestehenden Commits ändern, und Sie müssen möglicherweise das Ergebnis erzwingen, was problematisch sein kann, wenn Ihre Commits bereits von anderen geteilt werden.

+0

Verwenden Sie 'git interpret-trailers' mit' git filter-branch --msg-filter', anstatt die 'Signed-off-by:' oder andere Trailer manuell hinzuzufügen. Dadurch vermeiden Sie beispielsweise die Vervielfältigung von Trailern. –

+0

@ CurtJ.Sampson Ja! Vielen Dank. Ich habe das gestern buchstäblich dokumentiert: https://stackoverflow.com/a/41361273/6309. – VonC

+0

@ CurtJ.Sampson Ich habe die Antwort entsprechend geändert. – VonC

10

versuchen diese alten Commits mit einem -S zu wiederholen:

git filter-branch -f --commit-filter 'git commit-tree -S "[email protected]"' HEAD 

Danach müssen Sie git push -f. Aber Vorsicht, die Commit-IDs ändern sich und andere Leute werden nicht mehr synchron sein.

+1

Dies wird alle commits abmelden, oder? Wie kann ich nur die letzten X-Commits abschreiben? –

+5

@ ÁkosVandra, wenn Sie immer noch nach einer Antwort suchen: '' git filter-branch -f --commit-filter 'git commit-tree -S "$ @"' HEAD ~ X..HEAD'', wo X steht die Anzahl der letzten X-Commits. z.B. für die letzten 2 commits: '' git filter-branch -f --commit-filter 'git-commit-tree -S "$ @"' HEAD ~ 2..HEAD'' –

1

Für mich nur signof, ich habe meine commits auf github nicht verifiziert.

Die Lösung, die für mich gearbeitet wird, geht zurück, und dann jedes unterzeichnen begehen mit -S

git commit --amend -S 

Auch wenn Sie überprüfen, ob Ihr begehen tatsächlich unterzeichnet, und Ihre E-Mail/Name wird einfach nicht angehängt, mit diesem Befehl

git show HEAD --show-signature 

extra-Tipp: Wenn Sie bereits Ihre Commits zur Änderung, die Sie in ihnen Ihren wirklichen Namen möchten (siehe Verwendung git log). Möglicherweise verwenden Sie den Namen Ihres GitHub-Handles, der nicht benötigt wird. Es wird nur eine korrekte E-Mail benötigt und im Feld Benutzername sollten Sie Ihren vollständigen Namen verwenden und github wird diesen mit Ihrem Github-Handle-Namen korrekt verfolgen. So Ihren Benutzernamen zu korrigieren und Zeichen letzten Verwendung begehen:

git commit --amend --author="FULL NAME <email>" -S 

und auch eingestellt vollständigen Namen für Benutzernamen in Zukunft durch

git config --global user.name "FULL NAME" 
2

ich ein ähnliches Problem hatte. Hier dank Robin Johnson von Gentoo Linux ist ein Trick, um die Signatur zu allen meinen vorherigen nicht gedrückten Commits hinzuzufügen:

$ 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 
$