Perbedaan antara penulis dan pengangkat di Git?


237

Saya mencoba membuat komit

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

di mana John Doe adalah pengguna yang namanya ingin saya komit.

Tampaknya baik-baik saja git log. Namun, ketika saya melakukan gitk, nama penulis benar, tetapi nama committer diambil dari pengaturan konfigurasi global git saya (dan dengan demikian diatur ke nama / email saya).

Pertanyaan

  1. Apa perbedaan antara keduanya (committer vs author)?

  2. Haruskah saya mengatur committer juga ke pengguna lain?

  3. Jika ya, bagaimana?




Git committer ditempatkan dalam file .gitconfig. Jika --author Anda sama dengan nama .gitconfig, Anda hanya mendapatkan penulis di pesan commit. Jika mereka berbeda, Anda mendapatkan keduanya.
poGUIst

Jawaban:


216

Poster asli bertanya:

Apa perbedaan antara keduanya (Committer vs author)?

Penulis adalah orang yang awalnya menulis kode. Committer, di sisi lain, diasumsikan sebagai orang yang melakukan kode atas nama penulis asli. Ini penting di Git karena Git memungkinkan Anda untuk menulis ulang sejarah, atau menerapkan tambalan atas nama orang lain. The GRATIS secara online Pro Git buku menjelaskan seperti ini:

Anda mungkin bertanya-tanya apa perbedaan antara penulis dan pengangkut . The Penulis adalah orang yang awalnya menulis patch, sedangkan commit adalah orang yang terakhir diterapkan patch. Jadi, jika Anda mengirim tambalan ke proyek dan salah satu anggota inti menerapkan tambalan, Anda berdua mendapatkan kredit - Anda sebagai penulis dan anggota inti sebagai pengalih.

Poster asli bertanya:

Haruskah saya mengatur committer juga ke pengguna lain?

Tidak, jika Anda ingin jujur, Anda tidak boleh mengatur committer kepada penulis, kecuali jika penulis dan committer itu memang orang yang sama.


1
Saya masih bingung tentang ini. Saya memiliki ini terjadi, dan dalam kasus saya, sejauh yang saya ketahui, tidak ada tambalan atau penulisan ulang sejarah yang pernah terjadi (kecuali beberapa perintah git membuat dan menerapkan tambalan, secara tidak jelas, "di bawah tenda"). Apakah itu hanya 2 cara untuk hal seperti ini terjadi?
cowlinator

2
Juga, menyebut penulis "orang yang menulis kode" tidak masuk akal. Bagaimana git tahu siapa yang menulisnya? Ketika Anda mengatur git config userdan kemudian git adddan git commit, maka git akan tahu siapa yang menambahkan dan siapa yang berkomitmen, tetapi masih tidak tahu siapa yang menulisnya.
cowlinator

1
@ clinlinator Tidak tahu siapa yang menulis kode. Itu sebabnya Anda harus mengatakannya, jika bukan Anda. Perlu diingat bahwa sistem kontrol versi terdistribusi sebelumnya sebelum git ditemukan mengirim ~~ Linus ~~ email pengelola proyek dengan tambalan untuk diterapkan. Fungsionalitas ini ada sehingga ~~ Linus ~~ pengelola dapat menerapkan tambalan Anda sambil tetap memberi Anda kredit dengan cara 'resmi', bukan hanya ad-hoc dalam pesan komit.
Dana Gugatan Monica

92

Milis + git format-patch+ git applydapat menghasilkan penulis! = Pengemis

Dalam proyek-proyek seperti kernel Linux di mana tambalan adalah:

menghasilkan komit baru dengan pengarang dan pengalih berbeda:

  • penulis adalah siapa yang menulis tambalan
  • komuter adalah siapa yang mengelola proyek, dan yang menggabungkan tambalan

Lihat misalnya tambalan yang dipilih secara acak ini dan komit terkait:

Antarmuka web Git seperti GitHub dan GitLab dapat atau tidak dapat menghasilkan author! = Committer

Karena Git (Hub | Lab) menyimpan repositori upstream dan fork pada mesin yang sama, mereka dapat secara otomatis melakukan apa saja yang dapat Anda lakukan secara lokal, termasuk salah satu dari:

  • Buat komit gabungan.

    Tidak menghasilkan penulis! = Committer.

    Menjaga SHA atau komit baru tetap utuh, dan membuat komit baru:

    * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    

    Secara historis, ini adalah metode pertama yang tersedia di GitHub.

    Secara lokal, ini dilakukan dengan git merge --no-ff.

    Ini menghasilkan dua komitmen per permintaan tarikan, dan membuat garpu dalam sejarah git.

  • rebase di atas master

    GitHub juga meretas komit untuk mengatur committer == siapa pun yang menekan tombol gabungan. Ini tidak wajib, dan bahkan tidak dilakukan secara default oleh lokal git rebase, tetapi memberikan pertanggungjawaban kepada pengelola proyek.

    Pohon git sekarang terlihat seperti:

    * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    

    yang persis seperti itu dari git applytambalan email.

Di GitHub saat ini:

  • Anda memilih metode saat menggabungkan melalui dropdown pada tombol gabungan
  • metode dapat diaktifkan atau dinonaktifkan pada pengaturan repo oleh pemilik

https://help.github.com/articles/about-merge-methods-on-github/

Bagaimana cara mengatur committer dari komit baru?

Yang terbaik yang bisa saya temukan adalah menggunakan variabel lingkungan untuk mengganti committer:

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

Bagaimana cara mendapatkan committer dan tanggal komit dari komit yang diberikan?

Hanya data penulis yang ditampilkan secara default aktif git log.

Untuk melihat tanggal committer Anda dapat:

  • format log khusus untuk itu:

    git log --pretty='%cn %cd' -n1 HEAD
    

    di mana cndan cdberdiri untuk Committer NamedanCommitter Date

  • gunakan fullerformat yang telah ditentukan:

    git log --format=fuller
    

    Lihat juga: Cara mengkonfigurasi 'git log' untuk menampilkan 'tanggal komitmen'

  • turunkan level dan tunjukkan seluruh data komit:

    git cat-file -p HEAD
    

Bagaimana cara menetapkan tanggal committer dari komit baru?

git commit --date hanya menetapkan tanggal penulis: untuk tanggal committer yang terbaik yang dapat saya temukan adalah dengan variabel lingkungan:

GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'

Lihat juga: Apa perbedaan antara penulis dan pengangkut di Git?

Bagaimana Git menyimpan pengarang vs pengangkut secara internal?

Lihat: Apa format file dari objek komit git?

Pada dasarnya, komit adalah file teks, dan berisi dua bidang yang dipisahkan baris:

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}

Ini memperjelas bahwa keduanya adalah dua entri data yang sepenuhnya independen dalam objek komit.


1
Perhatikan bahwa bahkan dengan GIT_COMMITTER_*override, git masih akan menolak untuk melakukan komit jika Anda belum menetapkan committer default menggunakan git config.
adelphus

1
@adelphus pada Git 2.5, tidak bekerja jika Anda menetapkan keduaGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli郝海东冠状病六四事件法轮功

3

@Ciro Santilli 新疆 改造 中心 六四 事件 法轮功diusulkan untuk digunakan

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

Untuk menghindari pengulangan nama dan email, Anda dapat menggunakannya kembali

GIT_COMMITTER_NAME='a'; GIT_COMMITTER_EMAIL='a'; git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"

yang pertama-tama mengatur variabel dalam perintah terpisah, kemudian menggunakannya untuk git commitpanggilan (perhatikan tanda kurung ganda).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.