मैं "मास्टर" के अलावा डिफ़ॉल्ट शाखा के नाम के साथ Git रिपॉजिटरी कैसे बना सकता हूं?


102

में प्रो Git किताब है, यह कहना है

"मूल" विशेष नहीं है

जैसे कि शाखा का नाम "मास्टर" का कोई विशेष अर्थ नहीं है, न ही "मूल" है। जबकि "मास्टर" एक प्रारंभिक शाखा के लिए डिफ़ॉल्ट नाम है जब आप गिट इनिट चलाते हैं जो एकमात्र कारण है जिसका व्यापक रूप से उपयोग किया जाता है , "मूल" रिमोट के लिए डिफ़ॉल्ट नाम है जब आप गिट क्लोन चलाते हैं। यदि आप इसके बजाय git clone -o booyah चलाते हैं, तो आपके पास डिफ़ॉल्ट दूरस्थ शाखा के रूप में booyah / master होगा।

इसका अर्थ है, हम अपने डिफ़ॉल्ट शाखा नाम का उपयोग मुख्य या मुख्य-शाखा या कुछ इस तरह कर सकते हैं। मुझे ऐसा कोई विकल्प नहीं दिखाई दिया, man git-initजो मुझे repoएक अलग डिफ़ॉल्ट शाखा नाम के साथ आरंभ करेगा ।

GitHub दिखाता है कि अपने सेटिंग पृष्ठ में डिफ़ॉल्ट शाखा का नाम कैसे सेट करें । लेकिन मैं इस बारे में बात नहीं कर रहा हूं कि इसे किसी विशिष्ट Git होस्टिंग साइट पर कैसे सेट किया जाए । मैं केवल Git के संदर्भ में सख्ती से पूछ रहा हूं, किसी विशिष्ट Git होस्टिंग साइट के संबंध में नहीं ।

क्या ऐसा करने के लिए कोई रास्ता है?


1
Github.com/git-for-windows/git/issues/2674 में मुख्य / डिफ़ॉल्ट शाखा के नामकरण को देखने के लिए कुछ काम शुरू किया गया है ।
फिलिप ओकले

जवाबों:


104

नईरिट, नई रेपो

Git संस्करण 2.28.0 के बाद से git initकमांड अब --initial-branch(या -bसंक्षेप में) पैरामीटर लेता है । ये दोनों कमांड "ट्रंक" नाम की एक शाखा के साथ एक नया गिट रेपो बनाते हैं, जिसने हमेशा "मास्टर" (किस का स्वामी?) की तुलना में मेरे लिए अधिक समझदारी बनाई।

git init --initial-branch=trunk
git init -b trunk

यह init.defaultBranchसेटिंग के साथ कॉन्फ़िगर करने योग्य है। अगर मैं चाहता हूं कि सभी नए रिपॉजिट्स में डिफॉल्ट ब्रांच के रूप में "ट्रंक" हो:

git config --global init.defaultBranch trunk

पुराना गिट, नया रेपो

कुछ सिस्टम में अभी भी पुराने Git इंस्टॉलेशन हैं। मेरा डेबियन 10 सर्वर (बस्टर, अक्टूबर 2020 तक वर्तमान स्थिर संस्करण) Git 2.20 के साथ आता है, जो -bविकल्प का समर्थन नहीं करता है। एक विकल्प रिपॉजिटरी बनाना और फिर शाखा का नाम बदलना है। यह तकनीक सामान्य (गैर-नंगे) रिपोज के लिए काम करती है:

git init
git checkout -b trunk

इसके trunkबजाय वर्तमान शाखा के साथ एक नया भंडार बनाता है master। शाखा masterवास्तव में मौजूद नहीं है - शाखाएं तब तक नहीं बनती हैं जब तक कि उनके पास कम से कम एक प्रतिबद्ध न हो। जब तक शाखा नहीं बन जाती, तब तक शाखा में ही मौजूद रहता है .git/HEAD, जो बताता है कि masterजब आप स्विच करते हैं तो शाखा क्यों गायब हो जाएगी trunk

बेयर रिपोज

नंगे रेपो के लिए, आप नहीं चल सकते git checkout(कि नंगे होने का मतलब क्या है)। इसके बजाय, आप एक अलग शाखा में इंगित करने के लिए हेड को बदल सकते हैं:

git init --bare
git symbolic-ref HEAD refs/heads/trunk

पुराना प्रस्ताव

यदि आप पहले से ही प्रतिबद्ध हैं, तो आप git branch -mइसके बजाय भाग सकते हैं :

git init
touch file.txt
git add file.txt
git commit -m 'commit 1'
git branch -m trunk

इस से शाखा का नाम बदलता है masterकरने के लिए trunkएक बार यह बनाया गया है।

ऐसा लगता है कि तंत्र थोड़ा अलग है क्योंकि रिपॉजिटरी खाली है या नहीं, इस पर निर्भर करता है, लेकिन यह काम करता है। आप इसे "एक नई शाखा बनाने और हटाने master" के रूप में भी देख सकते हैं ।


पहले मामले में जब आप चलाते हैं git checkout -b trunk। क्या इसका मतलब है, तब से डिफ़ॉल्ट शाखा ट्रंक है?
अभिसेक

2
"डिफ़ॉल्ट" एक मिथ्या नाम का एक सा है। "वर्तमान शाखा" वास्तव में यहाँ क्या चल रहा है।
डिट्रिच एप्प

help.github.com/articles/setting-the-default-branch डिफ़ॉल्ट शाखा के बारे में बात करता है, इसलिए मैं थोड़ा भ्रमित हो गया। आपने जो कहा, उसका थोड़ा प्रयोग मैंने किया। पता चला कि git में "डिफ़ॉल्ट" जैसा कुछ नहीं है। धन्यवाद
Abhisek

4
यह एक GitHub अवधारणा की तरह दिखता है, Git अवधारणा की तरह नहीं। यह पुल अनुरोधों के बारे में बात करता है, और गिट में "पुल अनुरोध" जैसी कोई चीज नहीं है।
डिट्रिच एप्प

मैं बस कुछ इस तरह की तलाश कर रहा था
वेक्सोनी

92

आप git initएक अलग डिफ़ॉल्ट शाखा का उपयोग करने के लिए अप्रत्यक्ष रूप से कॉन्फ़िगर कर सकते हैं : वर्तमान शाखा द्वारा परिभाषित किया गया है HEAD, जो कि "बस" एक टेक्स्टफाइल है जो गिट को बताता है कि कौन सा वर्तमान है।

का उपयोग करते हुए init.templateDir, आप git initएक अलग का उपयोग करने के लिए कह सकते हैं :

# ~/.config/git/config or ~/.gitconfig
[init]
    templateDir = ~/.config/git/template/

और ~/.config/git/template/HEAD, एक ही लाइन (+ लाइनब्रेक) डालें: ref: refs/heads/main(शाखा में डिफ़ॉल्ट करने के लिए main)।

रिपॉजिटरी बनाते समय पूरी सामग्री templateDirको .gitनिर्देशिका में कॉपी किया जाता है; डिफ़ॉल्ट (यहां /usr/share/git-core/templates) में कुछ नमूना हुक और अन्य फाइलें हैं, लेकिन आप अपने नए टेम्पलेट निर्देशिका का उपयोग डिफ़ॉल्ट हुक को सेटअप करने के लिए कर सकते हैं, उदाहरण के लिए।

$ tree /usr/share/git-core/templates
/usr/share/git-core/templates
├── branches
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
└── info
    └── exclude

3 directories, 13 files

OSX पर इन निर्देशों का पालन करने वाले किसी भी व्यक्ति के लिए FYI करना आपको टेम्पलेट फ़ाइलों के लिए / usr / स्थानीय / git / share / git-core / टेम्पलेट्स में देखना होगा
ब्रायन ग्रेडिन

1
एनबी: आप HEADडिफ़ॉल्ट टेम्पलेट में एक फ़ाइल भी बना सकते हैं , हालांकि यह आपको बताएगा कि जब आप वास्तव में एक होते हैं तो एक रिपॉजिटरी को "पुन: व्यवस्थित" कर रहे हैं।
झपट्ट

24

मैं " master" के अलावा अन्य डिफ़ॉल्ट शाखा नाम के साथ Git रिपॉजिटरी कैसे बना सकता हूं ?

आप Git 2.28 (Q3 2020) का उपयोग करेंगे: मौजूदा रिपॉजिटरी में प्राथमिक शाखा का नाम, और नए बनाए गए रिपॉजिटरी में पहली शाखा के लिए उपयोग किया जाने वाला डिफ़ॉल्ट नाम, विन्यास योग्य बनाया गया है, ताकि हम अंततः हार्डकोड से खुद को दूर कर सकें। 'master '।

और GitHub से 2020 अगस्त से अनुस्मारक :

1 अक्टूबर, 2020 पर, अगर आप नए खजाने के लिए डिफ़ॉल्ट शाखा अपने उपयोगकर्ता, संगठन या उद्यम के लिए नहीं बदला है, यह स्वचालित रूप से बदल जाएगा masterकरने के लिएmain
आप किसी भी समय इस परिवर्तन से बाहर निकल सकते हैं:

  • उपयोगकर्ताओं के लिए, https://github.com/settings/repositories पर पेज पर
  • संगठन मालिकों के लिए, पर https://github.com/organizations/YOUR-ORGANIZATION/settings/repository-defaults पृष्ठ पर
  • एंटरप्राइज़ व्यवस्थापकों के लिए, https://github.com/enterprises/YOUR-ENTERPRISE/settings/member_privilegesपृष्ठ पर

यह बदलाव कई बदलावों में से एक है, GitHub परियोजनाओं और अनुरक्षकों का समर्थन करने के लिए बना रहा है जो अपनी डिफ़ॉल्ट शाखा का नाम बदलना चाहते हैं।
हमारे द्वारा किए जा रहे परिवर्तनों के बारे में अधिक जानने के लिए, जीथब / नाम बदलना देखें

लेकिन खुद पर वापस जाएं: (2.28, Q3 2020) 8oàn TrĐn Công Danh ( sgn) द्वारा प्रतिबद्ध 508fd8e (29 जून 2020) देखें ।
देखें प्रतिबद्ध 0068f21 , a471214 प्रतिबद्ध , 0cc1b47 प्रतिबद्ध , 32ba12d प्रतिबद्ध , 6069ecc प्रतिबद्ध , f0a96e8 प्रतिबद्ध , प्रतिबद्ध 4d04658 (24 जून 2020), और 489947c प्रतिबद्ध (23 जून 2020) से जोहानिस Schindelin ( dscho)डॉन गुडमैन-विल्सन ( ) द्वारा प्रतिबद्ध 8747ebb (24 जून 2020)
देखें । ( जूनियो सी हमानो द्वारा विलय - में -DEGoodmanWilson
gitster11cbda2 , 06 जुलाई 2020 को प्रतिबद्ध )

init: नई रिपॉजिटरी के लिए प्रारंभिक शाखा नाम निर्दिष्ट करने की अनुमति दें

साइन-ऑफ-बाय: जोहान्स शिंडलिन

अपनी रिपॉजिटरी की मुख्य शाखा का नाम बदलने के इच्छुक परियोजनाओं और कंपनियों की संख्या बढ़ रही है (देखें इस पर पृष्ठभूमि के लिए मिसलॉव मरोहनीक का ट्वीट )।

नए रिपॉजिटरी के लिए उस शाखा का नाम बदलने के लिए, वर्तमान में एकमात्र तरीका यह है कि स्वचालित रूप से Git के सभी टेम्पलेट निर्देशिका को कॉपी करके, फिर .git/HEADफ़ाइल में वांछित डिफ़ॉल्ट शाखा के नाम को हार्ड-कोडिंग किया जाए , और फिर init.templateDirउन कॉपी किए गए टेम्पलेट फ़ाइलों को इंगित करने के लिए कॉन्फ़िगर किया जाए।

इस प्रक्रिया को बहुत कम बोझिल बनाने के लिए, आइए एक नया विकल्प पेश करें --initial-branch=<branch-name>:।

git init --initial-branch=hello myLocalRepo
# or
git config --global init.defaultBranch hello
git init myLocalRepo

तथा:

init: कॉन्फ़िगरेशन के माध्यम से प्रारंभिक शाखा के नाम के लिए डिफ़ॉल्ट सेट करने की अनुमति दें


हेल्प -बाय: जोहान्स शिंडेलिन हेल्प-बाय: डेरिक स्टोले
साइन-ऑफ-बाय: डॉन गुडमैन-विल्सन

हमने --initial-branch=<branch-name>हार्ड-कोडित की तुलना में एक अलग प्रारंभिक शाखा के साथ एक नए भंडार को शुरू करने की अनुमति देने के लिए केवल कमांड-लाइन विकल्प पेश किया ।

उपयोगकर्ताओं को प्रारंभिक शाखा नाम को अधिक स्थायी रूप से ओवरराइड करने की अनुमति देने के लिए (अर्थात प्रत्येक और प्रत्येक git initआह्वान के लिए मैन्युअल रूप से नाम निर्दिष्ट किए बिना ), चलो init.defaultBranchविन्यास सेटिंग का परिचय दें ।

नोट: मर्ज कमिट मैसेज के बारे में 489947 c, के बाद से Git 2.29 में वापस कर दिया गया है, " मैं git के मर्ज कमिट मैसेज को कैसे कस्टमाइज़ कर सकता हूं? " देखें। सेटिंग रहती है।
init.defaultBranch


यह सबमॉड्यूल्स को प्रभावित करता है:

submodule: रिमोट के HEAD में वापस आ जाना

हेल्प-बाय: फिलिप ब्लेन
साइन-ऑफ-बाय: जोहान्स शिंडलिन

जब remote.<name>.branchकॉन्फ़िगर नहीं किया जाता है, तो git submodule updateवर्तमान में शाखा नाम का उपयोग करके वापस आ जाता है master
एक बहुत बेहतर विचार, हालांकि, रिमोट का उपयोग करना है HEAD: उचित रूप से हाल ही में Git संस्करण चलाने वाले सभी Git सर्वरों HEADपर, मुख्य शाखा को सिम्फ़र पॉइंट्स।

नोट: t7419 प्रदर्शित करता है कि वहाँ ऐसे मामलों का उपयोग किया जा सकता है जो दूरस्थ शाखा में सबमॉड्यूल्स को अपडेट करने की अपेक्षा git submodule update --remote करते हैं, masterभले ही रिमोट HEADदूसरी शाखा को इंगित करता हो।
यकीनन, यह पैच व्यवहार को अधिक सहज बनाता है, लेकिन इस बात की थोड़ी संभावना है कि इससे अस्पष्ट सेटअपों में प्रतिगमन हो सकता है।

फिर भी, इस व्यवहार को ठीक करने के लिए ठीक होना चाहिए, जैसे लंबी संक्रमण अवधि।

  • git submodule update --remoteआदेश वास्तव में आम नहीं है।
  • इस आदेश को चलाने के दौरान वर्तमान गिट का व्यवहार एकमुश्त भ्रमित है, जब तक कि दूरस्थ रिपॉजिटरी की वर्तमान शाखा नहीं है master (जिस मामले में प्रस्तावित व्यवहार पुराने व्यवहार से मेल खाता है)।
  • यदि कोई उपयोगकर्ता बदले हुए व्यवहार के कारण प्रतिगमन का सामना करता है, तो वास्तव में यह सुधार तुच्छ है: पुराने व्यवहार को बहाल करने के submodule.<name>.branchलिए सेटिंग master

ध्यान दें कि, Git 2.29 (Q4 2020) के साथ, परीक्षणों contrib/को हाल के परिवर्तन में समायोजित कर दिया गया है fmt-merge-msg

एमिली शफ़र ( ) द्वारा प्रतिबद्ध b87528c (03 अगस्त 2020) देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 83b8250 , 10 अगस्त 2020)nasamuffin
gitster

Revert "contrib: " subtreeमें बदलने के लिए परीक्षण समायोजित करें fmt-merge-msg"

साइन-ऑफ-बाय: एमिली शफ़र

यह श्रद्धा 508fd8e8baf3e18ee40b2cf0b8899188a8506d07 प्रतिबद्ध है

में 6e6029a8 ( fmt-merge-msg: हम व्यवहार जहां के खिलाफ 'मर्ज के वापस पाने के मर्ज गंतव्य लोप हो करने के लिए फिर से अनुमति देते हैं) master', डिफ़ॉल्ट रूप से, नहीं शामिल हैं " into 'master'मर्ज संदेश के अंत में"। इस परीक्षण फिक्स की अब आवश्यकता नहीं है।

इसके अलावा:

Git 2.29 (Q4 2020) के साथ, masterउनसे शब्द ' ' छोड़ने के लिए परीक्षण अपडेट करें।

देखें f33f2d3 प्रतिबद्ध , b6211b8 प्रतिबद्ध (26 सितं, 2020), और 432f5e6 प्रतिबद्ध , 5a0c32b प्रतिबद्ध , 659288c प्रतिबद्ध (21 सितं, 2020) से जोहानिस Schindelin ( dscho)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 58138d3 , 05 अक्टूबर 2020)

tests: masterशाखा नाम की विविधताओं से बचें

साइन-ऑफ-बाय: जोहान्स शिंडलिन

इस शब्द masterमें एक भरा हुआ इतिहास है जो नस्लीय अन्याय के निरंतर अनुस्मारक के रूप में कार्य करता है। Git परियोजना को इसे समाप्त करने की कोई इच्छा नहीं है और पहले से ही इसे टालना शुरू कर दिया है।

परीक्षण सूट डिफ़ॉल्ट नाम के अलावा अन्य शाखाओं के लिए इस नाम के रूपांतरों का उपयोग करता है। T3200 के अलावा, जहां हमने इसे पिछले प्रतिबद्ध में संबोधित किया था, उन उदाहरणों को स्वचालित रूप से नाम दिया जा सकता है क्योंकि उन्हें परीक्षण स्क्रिप्ट के बाहर किसी भी बदलाव की आवश्यकता नहीं है, तो चलो ऐसा करते हैं।

यह देखते हुए कि स्पर्श की गई शाखाओं की डिफ़ॉल्ट शाखा के साथ बहुत कम (यदि कुछ भी) करना है, तो हम पूरी तरह से अलग नामकरण योजना का उपयोग करना चुनते हैं: topic_<number>(यह topic-<number>इसलिए नहीं हो सकता क्योंकि t5515 test_oidशब्द के साथ मशीनरी का उपयोग करता है, और यह मशीनरी आंतरिक रूप से शेल चरों का उपयोग करती है। जिनके नाम में डैश नहीं हो सकते)।

यह ट्रिक इस (GNU) सेड इनवोकेशन द्वारा किया गया था:

$ sed -i 's/master\([a-z0-9]\)/topic_\1/g' t/t*.sh

और, अभी भी Git 2.29 के साथ:

देखें प्रतिबद्ध 538228e , प्रतिबद्ध a15ad5d (08 अक्टू 2020) से जोहानिस Schindelin ( dscho)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 62564ba , 08 अक्टू 2020)

t1415: mainरेफ नाम के रूप में उपयोग करने से बचें

साइन-ऑफ-बाय: जोहान्स शिंडलिन

एक पैच श्रृंखला है कि के लिए फॉल-बैक बदल जाएगा की तैयारी में init.defaultBranchकरने के लिए main, चलो का उपयोग नहीं mainइस परीक्षण लिपि में रेफरी नाम के रूप में।

अन्यथा, ( आदमी ) जो उन रेफ को पकड़ना चाहता है वह भी अप्रत्याशित रूप से पकड़ लेगा ।git for-each-ref ... | grep mainrefs/heads/main

चूँकि विचाराधीन रेफ वर्कट्री-लोकल होते हैं (अर्थात प्रत्येक वर्कट्री का अपना जैसा होता है, वैसे ही HEAD), और चूंकि टेस्ट केस पहले से ही द्वितीयक वर्कट्री का उपयोग करता है second, जिसे " ", आइए " first" इन नामों के बजाय " " उपयोग करें ।

इस पर, परीक्षण के शीर्षक को समायोजित करें जो "रेपो" के बारे में बात करते हैं जब उनका मतलब "वर्कट्री" के बजाय होता है।


17

चूंकि Git 2.28 (27 जुलाई, 2020 को रिलीज़) एक नया कॉन्फ़िगरेशन विकल्प है, init.defaultBranchजिसे हार्ड-कोडित शब्द को बदलने के लिए पेश किया जा रहा है master

डिफ़ॉल्ट रहता है master!

उपयोगकर्ता कॉन्फ़िगरेशन चर के डिफ़ॉल्ट मान को ओवरराइड कर सकता है:

$ git config --global init.defaultBranch main

आगे के विवरण के लिए git doc अध्याय पढ़ें init.defaultBranch का परिचय दें


हां, वही मैंने उसी पृष्ठ पर अपने उत्तर में लिखा है। stackoverflow.com/a/62983443/6309
VonC

और जो मैंने ट्विस्ट किया, उसी जवाब का जिक्र करते हुए: twitter.com/VonC_/status/1284968817010016268
VonC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.