लेखक और कमिट के बीच अंतर Git?


235

मैं जैसा कमिटमेंट करने की कोशिश कर रहा हूं

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

जहाँ जॉन डो कुछ उपयोगकर्ता हैं जिनके नाम पर मैं कमिट करना चाहता हूँ।

इसमें सब ठीक प्रतीत होता है git log। हालाँकि, जब मैं करता हूँ gitk, लेखक का नाम सही है, लेकिन कमिट नाम मेरे वैश्विक git config सेटिंग्स से उठाया गया है (और इस प्रकार मेरे नाम / ईमेल पर सेट है)।

प्रशन

  1. दोनों के बीच अंतर क्या है (कमिटर बनाम लेखक)?

  2. क्या मुझे अन्य उपयोगकर्ता के लिए कमिटर सेट करना चाहिए?

  3. यदि हाँ, तो कैसे?


4
jasonnoble.org/2009/04/github-set-authorcommitter.html यहाँ एक संक्षिप्त विवरण है।
रेने होले


Git कमिट को .gitconfig फ़ाइल में रखा गया है। यदि आप --author .gitconfig नाम के समान है, तो आपको प्रतिबद्ध संदेश में केवल लेखक मिलता है। यदि वे अलग-अलग हैं, तो आपको दोनों मिलते हैं।
PoGUIst

जवाबों:


214

मूल पोस्टर पूछता है:

दोनों के बीच अंतर क्या है (कमेटी बनाम लेखक)?

लेखक वह व्यक्ति है जिसने मूल रूप से कोड लिखा था। दूसरी ओर, कमिटेटर को वह व्यक्ति माना जाता है जिसने मूल लेखक की ओर से कोड किया था। Git में यह महत्वपूर्ण है क्योंकि Git आपको इतिहास को फिर से लिखने, या किसी अन्य व्यक्ति की ओर से पैच लागू करने की अनुमति देता है। नि : शुल्क ऑनलाइन प्रो Git पुस्तक इस तरह बताते हैं:

आप सोच रहे होंगे कि लेखक और कमिटर के बीच क्या अंतर है । लेखक , जबकि व्यक्ति जो मूल रूप से पैच लिखा है committer व्यक्ति जो पिछले पैच लागू किया है। इसलिए, यदि आप किसी प्रोजेक्ट में पैच भेजते हैं और कोर में से एक सदस्य पैच लागू करता है, तो आप दोनों को क्रेडिट मिलता है - आप लेखक और कोर सदस्य के रूप में कमिट करते हैं।

मूल पोस्टर पूछता है:

क्या मुझे अन्य उपयोगकर्ता के लिए कमिटर सेट करना चाहिए?

नहीं, यदि आप ईमानदार होना चाहते हैं, तो आपको लेखक के लिए कमेंट सेट नहीं करना चाहिए, जब तक कि लेखक और कमिटर वास्तव में एक ही व्यक्ति न हों।


1
मैं अभी भी इस बारे में उलझन में हूं। मेरे साथ ऐसा हुआ था, और मेरे मामले में, जहाँ तक मुझे जानकारी है, तब तक कोई पैच या इतिहास फिर से नहीं लिखा गया (जब तक कि कुछ git कमांड पैच नहीं बनाते और लागू नहीं करते, अपारदर्शी, "हुड के नीचे")। क्या वास्तव में ऐसा होने के लिए केवल 2 तरीके हैं?
काउललाइनर

2
इसके अलावा, लेखक को "कोड लिखने वाले व्यक्ति" से कोई मतलब नहीं है। कैसे पता चलेगा कि इसे किसने लिखा है? जब आप सेट git config userऔर फिर git addऔर git commit, फिर Git पता होगा जो जोड़ा गया है और जो प्रतिबद्ध है, लेकिन यह अभी भी पता नहीं है जो इसे लिखा था।
23

1
@cowlinator यह नहीं जानता कि कोड किसने लिखा है। इसलिए आपको यह बताना होगा, अगर यह आप नहीं हैं। ध्यान रखें कि गिट का आविष्कार करने से पहले पिछले वितरित संस्करण नियंत्रण प्रणाली ~~ Linus ~~ को भेजने के लिए पैच के साथ परियोजना अनुचर ईमेल भेज रहा था। यह कार्यक्षमता है तो ~~ Linus ~~ अनुचर आपके पैच को लागू कर सकता है जबकि अभी भी आपको इसके लिए 'आधिकारिक' तरीके से क्रेडिट कर सकता है, बजाय प्रतिबद्ध संदेश में केवल तदर्थता के।
निधि मोनिका का मुकदमा

92

मेलिंग सूची + git format-patch+ git applyलेखक उत्पन्न कर सकता है! = कमिटेटर

लिनक्स कर्नेल जैसी परियोजनाओं में जहां पैच हैं:

अलग-अलग लेखक और कमिटर के साथ एक ही नई प्रतिबद्धता उत्पन्न करना:

  • लेखक कौन पैच लिखा है
  • कमिटेटर वह है जो प्रोजेक्ट मेंटेनर है, और जिसने पैच को मर्ज किया है

उदाहरण के लिए देखें यह बेतरतीब ढंग से चयनित पैच और संबंधित प्रतिबद्ध:

GitHub और GitLab जैसे गिट वेब इंटरफेस लेखक उत्पन्न कर सकते हैं या नहीं!

चूंकि गिट (हब। लैब) एक ही मशीन पर अपस्ट्रीम और फोर्क रिपॉजिटरी दोनों को पकड़ते हैं, वे स्वचालित रूप से कुछ भी कर सकते हैं जो आप स्थानीय स्तर पर भी कर सकते हैं, जिनमें से कोई भी शामिल है:

  • एक मर्ज कमेट बनाएँ।

    लेखक उत्पन्न नहीं करता है!

    SHA या नई प्रतिबद्धता बरकरार रखता है, और एक नई प्रतिबद्धता बनाता है:

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

    ऐतिहासिक रूप से, GitHub पर यह पहली उपलब्ध विधि थी।

    स्थानीय रूप से, इसके साथ किया जाता है git merge --no-ff

    यह प्रति पुल अनुरोध के लिए दो हिट बनाता है, और गिट इतिहास में एक कांटा रखता है।

  • के शीर्ष पर रिबास master

    GitHub ने कमिट == जो भी मर्ज बटन दबाया है, को कमिट करने के लिए हैक करता है। यह अनिवार्य नहीं है, और डिफ़ॉल्ट रूप से स्थानीय रूप से भी नहीं किया जाता है git rebase, लेकिन यह परियोजना अनुरक्षक को जवाबदेही देता है।

    गिट का पेड़ अब दिखता है:

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

    जो git applyईमेल पैच की तरह ही है ।

वर्तमान में GitHub पर:

  • आप मर्ज बटन पर ड्रॉपडाउन के माध्यम से विलय करते समय विधि का चयन करें
  • मालिक द्वारा रेपो सेटिंग्स पर तरीकों को सक्षम या अक्षम किया जा सकता है

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

नई कमेटी का कमिटेटर कैसे सेट करें?

सबसे अच्छा मैं पा सकता है कि कम्बिटर को ओवरराइड करने के लिए पर्यावरण चर का उपयोग कर रहा था:

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

किसी दिए गए कमिट का कमिटमेंट और डेट कैसे प्राप्त करें?

केवल लेखक डेटा डिफ़ॉल्ट रूप से दिखाता है git log

कमिट तिथि देखने के लिए आप या तो:

  • उस के लिए विशेष रूप से लॉग प्रारूप:

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

    जहां cnऔर cdके लिए खड़े हो Committer NameऔरCommitter Date

  • fullerपूर्वनिर्धारित प्रारूप का उपयोग करें :

    git log --format=fuller
    

    इसे भी देखें: 'कमिट डेट' दिखाने के लिए 'git लॉग' कैसे कॉन्फ़िगर करें

  • निम्न स्तर पर जाएं और संपूर्ण प्रतिबद्ध डेटा दिखाएं:

    git cat-file -p HEAD
    

नई कमेटी की कमिट डेट कैसे सेट करें?

git commit --date केवल लेखक की तिथि निर्धारित करता है: सबसे कम तारीख के लिए जो मुझे मिल सकता है वह पर्यावरण चर के साथ था:

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

यह भी देखें: लेखक और कमिट के बीच अंतर क्या है?

Git स्टोर लेखक बनाम आंतरिक रूप से कमिट कैसे करता है?

देख: फ़ाइल कमिट ऑब्जेक्ट का प्रारूप क्या है?

असल में, प्रतिबद्ध एक पाठ फ़ाइल है, और इसमें दो पंक्ति अलग फ़ील्ड हैं:

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

इससे यह स्पष्ट होता है कि दोनों प्रतिबद्ध वस्तु में दो पूरी तरह से स्वतंत्र डेटा प्रविष्टियां हैं।


1
ध्यान दें कि यहां तक ​​कि GIT_COMMITTER_*ओवरराइड्स के साथ , git अभी भी एक प्रतिबद्ध प्रदर्शन करने से इंकार कर देगा यदि आपने एक डिफ़ॉल्ट कमिटर का उपयोग करके सेट नहीं किया है git config
एडेल्फ़स

1
Git 2.5 पर @adelphus, यह काम करता है यदि आप दोनों को सेट करते हैंGIT_{COMMITTER,AUTHOR}_EMAIL
Ciro Santilli 郝海东 G G G 六四 六四

3

@Ciro Santilli 新疆 改造 iro 事件 法轮功। का उपयोग करने का प्रस्ताव दिया

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

नाम और ईमेल को दोहराने से बचने के लिए, आप उनका पुन: उपयोग कर सकते हैं

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

जो पहले चर को अलग-अलग कमांड में सेट करता है, फिर git commitकॉल के लिए उनका उपयोग करता है (डबल कोष्ठक पर ध्यान दें)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.