Git ve yazar arasındaki fark nedir?


237

Gibi bir taahhütte bulunmaya çalışıyorum

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

John Doe adında taahhütte bulunmak istediğim bir kullanıcı.

Tamam görünüyor git log. Ancak ben yaptığınızda, gitk, yazar adı doğru fakat committer adı benim küresel git config ayarlarından alınır (ve böylece benim adım / e-postaya ayarlanır).

Sorular

  1. İkisi arasındaki fark nedir (committer vs author)?

  2. Committer'ı diğer kullanıcıya da ayarlamalı mıyım?

  3. Evet ise, nasıl?




Git committer .gitconfig dosyasına yerleştirilir. --Author .gitconfig adıyla aynıysa, yalnızca ileti iletisinde yazar elde edersiniz. Eğer farklılarsa, ikisini birden alırsınız.
poGUIst

Yanıtlar:


216

Orijinal poster soruyor:

İkisi arasındaki fark nedir (Committer vs author)?

Yazar kodu ilk olarak yazan kişidir. Öte yandan taşıtın, kodu orijinal yazar adına işleyen kişi olduğu varsayılır. Git'te bu önemlidir, çünkü Git geçmişi yeniden yazmanıza veya başka bir kişi adına düzeltme ekleri uygulamanıza izin verir. SERBEST çevrimiçi Pro Git kitabı şöyle açıklıyor:

Yazar ile komisyoncu arasındaki farkın ne olduğunu merak ediyor olabilirsiniz . Yazar , oysa başlangıçta yama yazdı kişidir committer son yama uygulanan kişidir. Yani, bir projeye bir yama gönderirseniz ve çekirdek üyelerden biri yamayı uygularsa, her ikiniz de kredi alırsınız - yazar olarak ve ana üye olarak komisyon sahibi olarak.

Orijinal poster soruyor:

Committer'ı diğer kullanıcıya da ayarlamalı mıyım?

Hayır, dürüst olmak istiyorsanız, yazar ve taciz gerçekten aynı kişi değilse, taciri yazara ayarlamamanız gerekir.


1
Hala bu konuda kafam karıştı. Bu oldu ve benim durumumda, bildiğim kadarıyla, hiçbir yama veya tarih yeniden yazma gerçekleşmedi (bazı git komutları opak bir şekilde "başlık altında" yamalar oluşturup uygulamadığı sürece). Bunlar gerçekten böyle bir şeyin gerçekleşmesinin tek 2 yolu mu?
cowlinator

2
Ayrıca, yazara "kodu yazan kişi" demek mantıklı değildir. Git bunu kimin yazdığını nasıl bilebilir? Ayarladığınızda git config userve sonra git addve git commitsonra git ekledi kim olduğunu ve işleyenlerin, ama yine de yazarının kim bilemeyiz ederim.
cowlinator

1
@cowlinator Kodu kimin yazdığını bilmiyor. Bu yüzden söylemelisin, eğer sen değilsen. Git icat edilmeden önceki bir önceki dağıtılmış sürüm kontrol sisteminin ~~ Linus ~~ proje yöneticisi e-postaları yamaları ile göndermek için olduğunu unutmayın. Bu işlevsellik oradadır, çünkü bakımcı yama mesajınızı, taahhüt mesajında ​​geçici olmak yerine, hala 'resmi' bir şekilde kredilendirirken uygulayabilir.
Monica'nın Davası

92

Posta listesi + git format-patch+ git applyyazar oluşturabilir! = Committer

Yamaların olduğu Linux çekirdeği gibi projelerde:

farklı yazar ve komisyoncularla tek bir yeni taahhüt oluşturmak:

  • yazar yamayı yazan
  • komisyoncu, proje sorumlusu kimdir ve yamayı birleştiren kişidir

Örneğin bu rastgele seçilen yamaya ve ilgili işleme bakınız:

GitHub ve GitLab gibi Git web arayüzleri yazar üretebilir veya üretmeyebilir! = Committer

Git (Hub | Lab) hem yukarı akış hem de çatal depolarını aynı makinede tuttuğundan, aşağıdakilerden biri de dahil olmak üzere yerel olarak da yapabileceğiniz her şeyi otomatik olarak yapabilirler:

  • Bir birleştirme taahhüdü oluşturun.

    Yazar oluşturmaz! = Committer.

    SHA'yı veya yeni taahhüdü sağlam tutar ve yeni bir taahhüt oluşturur:

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

    Tarihsel olarak, bu GitHub'daki ilk kullanılabilir yöntemdi.

    Yerel olarak, bu ile yapılır git merge --no-ff.

    Bu, çekme isteği başına iki işlem üretir ve git geçmişinde bir çatal tutar.

  • üstüne inmek master

    GitHub ayrıca, birleştirme düğmesine kim basmışsa committer == ayarlamak için taahhütleri hackler. Bu zorunlu değildir ve varsayılan olarak yerel olarak yapılmaz git rebase, ancak proje yöneticisine hesap verebilirlik sağlar.

    Git ağacı şimdi şöyle görünüyor:

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

    bu git applye-posta yamaları gibidir.

Şu anda GitHub'da:

  • birleştirme düğmesindeki açılır menüden birleştirme yöntemini seçersiniz
  • yöntemler repo ayarlarında sahibi tarafından etkinleştirilebilir veya devre dışı bırakılabilir

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

Yeni bir taahhütte bulunmak nasıl yapılır?

Bulabildiğim en iyi, değişkeni geçersiz kılmak için ortam değişkenlerini kullanmaktı:

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

Belirli bir taahhüdün teslim ve taahhüt tarihini nasıl alabilirim?

Varsayılan olarak yalnızca yazar verileri gösterilir git log.

Başlangıç ​​tarihini görmek için aşağıdakilerden birini yapabilirsiniz:

  • günlüğü özellikle bunun için biçimlendirin:

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

    nerede cnve nerede cddurun Committer NameveCommitter Date

  • fullerönceden tanımlanmış formatı kullanın :

    git log --format=fuller
    

    Ayrıca bkz: 'git günlüğünü' 'bitiş tarihi' gösterecek şekilde yapılandırma

  • düşük seviyeye gidin ve tüm taahhüt verilerini gösterin:

    git cat-file -p HEAD
    

Yeni bir taahhüdün başlama tarihi nasıl belirlenir?

git commit --date sadece yazar tarihini ayarlar: değiştirici tarih için bulabildiğim en iyi ortam değişkeni idi:

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

Ayrıca bakınız: Git'teki yazar ve committer arasındaki fark nedir?

Git, yazarı ve taşıt olanı dahili olarak nasıl depolar?

Bkz: git kesinleştirme nesnesinin dosya biçimi nedir?

Temel olarak, kesinleştirme bir metin dosyasıdır ve iki satırla ayrılmış alan içerir:

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

Bu, her ikisinin tamamlama nesnesinde tamamen bağımsız iki veri girişi olduğunu açıkça ortaya koymaktadır.


1
GIT_COMMITTER_*Geçersiz kılmalar olsa bile , git tuşunu kullanarak varsayılan bir değiştirici ayarlamadıysanız yine de bir taahhütte bulunmayı reddedecektir git config.
adelphus

1
Her iki set halinde @adelphus Git 2.5, bir çalışırGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli郝海东冠状病六四事件法轮功

3

@Ciro Santilli 法轮功 改造 中心 六四 事件 法轮功 kullanılması önerildi

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

Adı ve e-postayı tekrarlamaktan kaçınmak için bunları tekrar kullanabilirsiniz

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

değişkenleri önce ayrı komutlarda ayarlar, sonra bunları git commitçağrı için kullanır (çift parantezleri not edin).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.