La mailing list + git format-patch
+ git apply
può generare l'autore! = Committer
In progetti come il kernel Linux in cui le patch sono:
generare un nuovo nuovo commit con autori e committer diversi:
- l'autore è chi ha scritto la patch
- il committer è chi è un manutentore del progetto e chi ha unito la patch
Vedi ad esempio questa patch selezionata casualmente e il commit corrispondente:
Le interfacce web di Git come GitHub e GitLab possono o meno generare autore! = Committer
Poiché Git (Hub | Lab) contiene sia i repository upstream che quelli fork su una stessa macchina, possono automaticamente fare tutto ciò che si può fare anche localmente, incluso uno dei seguenti:
Crea un commit di unione.
Non genera autore! = Committer.
Mantiene intatto SHA o il nuovo commit e crea un nuovo commit:
* Merge commit (committer == author == project maintainer)
|\
| * Feature commit (committer == author == contributor)
|/
* Old master (random committer and author)
Storicamente, questo è stato il primo metodo disponibile su GitHub.
A livello locale, questo viene fatto git merge --no-ff
.
Questo produce due commit per richiesta pull e mantiene un fork nella cronologia git.
rebase sopra master
GitHub modifica anche gli commit per impostare committer == chiunque abbia premuto il pulsante Unisci. Questo non è obbligatorio e non è nemmeno eseguito di default localmente da git rebase
, ma dà responsabilità al responsabile del progetto.
L'albero git ora assomiglia a:
* Feature commit (committer == maintainer, author == contributor)
|
* Old master (random committer and author)
che è esattamente come quello delle git apply
patch di posta elettronica.
Su GitHub attualmente:
- si sceglie il metodo durante l'unione tramite il menu a discesa sul pulsante Unisci
- i metodi possono essere abilitati o disabilitati sulle impostazioni del repository dal proprietario
https://help.github.com/articles/about-merge-methods-on-github/
Come impostare il committer di un nuovo commit?
Il meglio che ho trovato è stato usare le variabili d'ambiente per sovrascrivere il committer:
GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'
Come ottenere il committer e la data di commit di un determinato commit?
Solo i dati dell'autore vengono visualizzati per impostazione predefinita su git log
.
Per vedere la data del committer puoi:
formattare il registro appositamente per quello:
git log --pretty='%cn %cd' -n1 HEAD
dove cn
e cd
rappresentano Committer Name
eCommitter Date
usa il fuller
formato predefinito:
git log --format=fuller
Vedi anche: Come configurare 'git log' per mostrare 'commit date'
passare a un livello basso e mostrare tutti i dati di commit:
git cat-file -p HEAD
Come impostare la data del committer di un nuovo commit?
git commit --date
imposta solo la data dell'autore: per la data del committer il meglio che ho trovato è stato con la variabile d'ambiente:
GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'
Vedi anche: Qual è la differenza tra autore e committer in Git?
In che modo Git archivia internamente autore e committer?
Vedi: Qual è il formato del file di un oggetto commit git?
Fondamentalmente, il commit è un file di testo e contiene due campi separati da riga:
author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}
Ciò chiarisce che entrambe sono due voci di dati completamente indipendenti nell'oggetto commit.