C’è un modo per “autosign” commettere in Git con una chiave GPG?

C’è un modo semplice per far sì che Git segni sempre ogni commit o tag che viene creato?

L’ho provato con qualcosa di simile:

  alias commit = commit -S 

Ma questo non ha funzionato.

Non voglio installare un programma diverso per farlo accadere. È fattibile con facilità?

Solo una domanda a parte, forse i commit non dovrebbero essere firmati, solo i tag, che non creo mai, poiché invio singoli commit per un progetto come Homebrew, ecc.

Nota: se non vuoi aggiungere -S tutto il tempo per assicurarti che i tuoi commit siano firmati, c’è una proposta (ramo ‘ pu ‘ per ora, dicembre 2013, quindi non è garantito che lo farà a un rilascio di git) per aggiungere una configurazione che si prenderà cura di quell’opzione per te.
Aggiornamento maggio 2014: è in Git 2.0 (dopo essere stato rinviato in questa serie di patch )

Vedi commit 2af2ef3 di Nicolas Vigier (boklm) :

Aggiungi l’opzione commit.gpgsign per firmare tutti i commit

Se vuoi che GPG firmi tutti i tuoi commit, devi aggiungere l’opzione -S tutto il tempo.
L’opzione di configurazione commit.gpgsign consente di firmare tutti i commit automaticamente.

 commit.gpgsign 

Un booleano per specificare se tutti i commit devono essere firmati GPG.
L’utilizzo di questa opzione quando si eseguono operazioni come rebase può comportare la firma di un gran numero di commit. Potrebbe essere conveniente utilizzare un agente per evitare di digitare più volte la passphrase GPG.


Quella configurazione è solitamente impostata per repository (non è necessario firmare i repository locali sperimentali privati):

 cd /path/to/repo/needing/gpg/signature git config commit.gpgsign true 

Lo combinerai con user.signingKey usato come impostazione globale (chiave univoca usata per tutti i pronti contro termine dove vuoi firmare commit)

 git config --global user.signingkey F2C7AB29 

user.signingKey stato introdotto in git 1.5.0 (gennaio 2007) con commit d67778e :

Non dovrebbe esserci il requisito che io usi la stessa forma del mio nome nel mio repository git e nella mia chiave gpg.
Inoltre, potrei avere più chiavi nel mio mazzo di chiavi e potrei volerne usare uno che non corrisponde all’indirizzo che uso nei messaggi di commit.

Questa patch aggiunge una voce di configurazione ” user.signingKey ” che, se presente, verrà passata allo switch “-u” per gpg, consentendo di sovrascrivere la chiave di firma del tag.

Questo è applicato con commit aba9119 (git 1.5.3.2) per catturare il caso in cui Se l’utente ha configurato user.signingKey nel proprio .git/config o semplicemente non ha chiavi segrete sul proprio portachiavi.

Gli appunti:

  • Per convenzione, dal git 2.4.0 Marzo 2015 , è signingKey , non signingkey , anche se le chiavi git config sono case insensitive. Ciò sarebbe importante solo se si git config --get-regexp , che è case sensitive, altrimenti è solo una convenzione di leggibilità;
  • Se si desidera che il server git verifichi la firma per ogni push , sarà necessario almeno git 2.2+ (ottobre 2014) ( commit b945901 ), poiché git push --signed non ha considerato il valore di configurazione user.signingKey ;
  • git 2.9 (giugno 2016) userà user.signingKey per forzare la firma di tag annotati e commit: commit 61c2fe0 .
 git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 git config --global commit.gpgSign true 

Sostituire 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 con l’ID della chiave. Ricorda: non è mai una buona idea usare l’ID breve .

AGGIORNAMENTO: Per un nuovo editto di git , tutte le chiavi di configurazione devono trovarsi in camelCase.

Modifica: A partire da Git versione 1.7.9, è ansible firmare Git commit ( git commit -S ). Aggiornare leggermente la risposta per riflettere questo.

Il titolo della domanda è:

C’è un modo per “autosign” commettere in Git con una chiave GPG?

Risposta breve: sì, ma non farlo.

Affrontare l’errore nella domanda: git commit -s non firma il commit. Piuttosto, dalla pagina man git-commit :

-s, –signoff
Aggiungi Disconnesso dal committer alla fine del messaggio del log di commit.

Questo dà un output di registro simile al seguente:

 ± $ git log [0:43:31] commit 155deeaef1896c63519320c7cbaf4691355143f5 Author: User Name Date: Mon Apr 16 00:43:27 2012 +0200 Added .gitignore Signed-off-by: User Name 

Nota il bit “Signed-off: …”; è stato generato dal flag -s sul git-commit .

Citando l’ e-mail di annuncio di rilascio :

  • “git commit” appreso “-S” in GPG: firma il commit; questo può essere mostrato con l’opzione “–show-signature” su “git log”.

Quindi sì, puoi firmare commit. Tuttavia, io personalmente sollecito caucanvas con questa opzione; la firma automatica dei commit è quasi inutile, vedi sotto:

Solo una domanda a parte, forse i commit non dovrebbero essere firmati, solo i tag, che non creo mai, mentre invio singoli commit.

È corretto. I commit non sono firmati; i tag sono. La ragione di ciò può essere trovata in questo messaggio di Linus Torvalds , l’ultimo paragrafo di cui dice:

Firmare ogni commit è totalmente stupido. Significa solo che lo si automatizza e che la firma vale meno. Inoltre non aggiunge alcun valore reale, dal momento che il modo in cui la catena DAG git di SHA1 funziona, hai sempre bisogno di una sola firma per rendere tutti i commit raggiungibili da quella effettivamente coperta da quella. Quindi firmare ogni commit significa semplicemente mancare il punto.

Incoraggerei una ricerca del messaggio collegato, che chiarisce perché la registrazione si commette automaticamente non è una buona idea in un modo molto migliore di quanto avrei potuto.

Tuttavia , se vuoi firmare automaticamente un tag , puoi farlo avvolgendo il git-tag -[s|u] in un alias; se hai intenzione di farlo, probabilmente vorrai impostare l’id della chiave in ~/.gitconfig o nel file .git/config specifico del progetto. Ulteriori informazioni su tale processo possono essere visualizzate nel libro della community di git . I tag di firma sono infinitamente più utili della firma di ogni commit che fai.

Per fare in modo che la firma automatica funzioni pre git versione 2.0, dovrai aggiungere git alias per il commit.

 # git config --global alias.commit commit -S [alias] commit = commit -S 

Devi chiarire che se firmi un commit o un tag, non intendi che approvi l’intera cronologia. In caso di commit, si limita a firmare la modifica e in caso di tag, beh .. è necessario definire cosa intendi con esso. Potresti aver apportato una modifica che afferma che proviene da te ma non lo era (perché qualcun altro l’ha trasmesso al tuo telecomando). Oppure è un cambiamento in cui non vuoi essere, ma hai appena firmato il tag.

Nei tipici progetti OSS questo potrebbe essere meno comune, ma in uno scenario aziendale in cui si tocca solo il codice di tanto in tanto e non si legge l’intera cronologia potrebbe non essere notato.

La firma dei commit è un problema se verranno reimpostati o selezionati da altri genitori. Ma sarebbe bene se un commit modificato potesse puntare al commit “originale” che effettivamente verifica.