मास्टर के अलावा कुछ को इंगित करने के लिए एक Git दूरस्थ HEAD बदलें


124

मैं "मास्टर" के अलावा कुछ को इंगित करने के लिए एक Git रिमोट का HEAD संदर्भ कैसे सेट करूं?

मेरी परियोजना में एक "मास्टर" शाखा का उपयोग न करने की नीति है (सभी शाखाओं में सार्थक नाम हैं)। इसके अलावा, कैनोनिकल मास्टर रिपॉजिटरी केवल ssh: // के माध्यम से सुलभ है, बिना शेल एक्सेस (जैसे GitHub या Unfuddle) के साथ।

मेरी समस्या यह है कि दूरस्थ रिपॉजिटरी में अभी भी रेफरी / हेड / मास्टर के लिए एक हेड संदर्भ है, लेकिन मुझे इसकी आवश्यकता एक अलग शाखा को इंगित करने के लिए है। यह दो समस्याएं पैदा कर रहा है:

  1. रेपो की क्लोनिंग करते समय, यह,

    चेतावनी: दूरस्थ HEAD कोई भी संदर्भित रेफरी, चेकआउट करने में असमर्थ है।

    यह भ्रामक और असुविधाजनक है।

  2. वेब-आधारित कोड ब्राउज़र पेड़ को ब्राउज़ करने के आधार के रूप में HEAD पर निर्भर करता है। मुझे एक वैध शाखा की ओर इशारा करने की आवश्यकता है, तब।


बस रिकॉर्ड के लिए एक संभावना को जोड़ा, लेकिन आपके मामले के लिए उपयुक्त नहीं है।
वॉन सी.पी.

"नहीं-आम-पूर्वज" चाल: दिलचस्प। आप इसे एक विस्तृत उत्तर के रूप में पोस्ट कर सकते हैं और इसे आधिकारिक रूप से चुन सकते हैं यदि आप इसे काम करते हुए पाते हैं।
वॉन सी.पी.

12
FWIW, चूंकि आपने प्रश्न में GitHub का उल्लेख किया है - यदि आप GitHub पर HEAD रेफरी को बदलना चाहते हैं, तो बस रिपॉजिटरी की "एडमिन" स्क्रीन पर जाएं, और जो भी शाखा आपको इंगित करनी है, उसमें "डिफ़ॉल्ट शाखा" ड्रॉपडाउन को बदल दें।
जो


जवाबों:


63

एक साल पहले GitHub पर लगभग यही सवाल था।

मास्टर शाखा का नाम बदलने का विचार था:

git branch -m master development
git branch -m published master
git push -f origin master 

मास्टर बनाना वह है जो आप चाहते हैं कि लोग उपयोग करें, और अन्य सभी कार्य शाखाओं में करें।

("ए" git-symbolic-ref HEAD refs/head/publishedको दूरस्थ रेपो में प्रचारित नहीं किया जाएगा)

यह " मैं Git में मूल / मास्टर को कैसे हटाऊं " के समान है ।


जैसा कि इस सूत्र में कहा गया है : (जोर मेरा)

" git clone" केवल एक ही स्थानीय शाखा बनाता है।
ऐसा करने के लिए, यह HEAD refरिमोट रेपो को देखता है , और इसके द्वारा संदर्भित दूरस्थ शाखा के समान नाम से एक स्थानीय शाखा बनाता है।

इसलिए इसे लपेटने के लिए, आपके पास रेपो ए और क्लोन है:

  • HEADसंदर्भ refs/heads/masterऔर यह मौजूद है
    -> आपको एक स्थानीय शाखा मिलती है जिसे मूल / मास्टर से शुरू करके मास्टर कहा जाता है

  • HEAD संदर्भ refs/heads/anotherBranchऔर वह मौजूद है
    -> आपको एक स्थानीय शाखा मिलती है anotherBranch, जिसे कहा जाता हैorigin/anotherBranch

  • हेड संदर्भ refs/heads/masterऔर वह मौजूद नहीं है
    -> "गिट क्लोन" शिकायत करता है

यकीन नहीं होता कि HEADरेपो में रेफ को सीधे संशोधित करने का कोई तरीका है

(जो आपके प्रश्न का सभी बिंदु है, मुझे पता है;))


शायद एक ही रास्ता "गरीबों के लिए प्रकाशन" होगा , जहां आप:

 $ git-symbolic-ref HEAD refs/head/published
 $ git-update-server-info
 $ rsync -az .git/* server:/local_path_to/git/myRepo.git/

लेकिन इसमें सर्वर तक लिखना शामिल होगा, जो हमेशा संभव नहीं होता है।


जैसा कि मैं समझाता हूं " Git: नंगे रिपॉजिटरी में सक्रिय शाखा को बदलने का सही तरीका? ", git remote set-headरिमोट रेपो पर कुछ भी नहीं बदलेगा।

यह केवल आपके स्थानीय रेपो में स्थानीय रूप से संग्रहीत दूरस्थ ट्रैकिंग शाखा को बदल देगा remotes/<name>/HEAD


धन्यवाद, VonC। मैंने यहाँ पोस्ट करने से पहले पढ़ा। लेकिन जैसा कि आप देख सकते हैं, "मास्टर" नामक एक शाखा तकनीकी और नीतिगत कारणों से इस परियोजना में अवांछित है।
जेसनस्मिथ

फिर आप प्री-कमिट हुक के माध्यम से मास्टर ब्रांच पर किसी भी अपडेट को रोककर उस पॉलिसी को लागू कर सकते हैं।
वॉन सी.पी. 28'09

हां, अगर यह पता चला कि जो मैं चाहता हूं वह करने का कोई तरीका नहीं है, तो मैं ठीक यही करूंगा और आपका जवाब स्वीकार करूंगा। फॉलो करने के लिए धन्यवाद!
जेसनस्मिथ

अद्यतन के लिए धन्यवाद। फिलहाल, मैंने केवल एक कमिटमेंट के साथ मास्टर ब्रांच बनाने के लिए "नो-कॉमन-आंसर" ट्रिक का इस्तेमाल किया। (यानी: गिट ब्रांच-डी मास्टर; इको रेफ: रेफ्स / हेड्स / मास्टर> .ITIT / HEAD; rm *)। तब मैंने सिर्फ GO_AWAY नामक एक फ़ाइल को छुआ, और प्रतिबद्ध संदेश स्थिति की व्याख्या करता है। वह अभी के लिए काम करेगा। मैं स्रोत के माध्यम से जांच कर सकता हूं और नीचे ट्रैक कर सकता हूं जहां प्राप्त करने वाला पक्ष अंतिम उत्तर के लिए HEAD सेट करता है।
जेसनस्मिथ

1
@ctn यह केवल इसलिए है क्योंकि मैं -f( --force) विकल्प भूल गया था । मैंने उसी के अनुसार उत्तर संपादित किया है। फिर जवाब आप संदर्भ है कि एक ही विकल्प का उपयोग करता है।
वॉन

42

अपडेट: यह केवल रिपॉजिटरी ("क्लाइंट") की स्थानीय कॉपी के लिए काम करता है। कृपया दूसरों की टिप्पणियाँ नीचे देखें।

गिट (फरवरी 2014) के हालिया संस्करण के साथ, सही प्रक्रिया होगी:

git remote set-head $REMOTE_NAME $BRANCH

इसलिए उदाहरण के लिए, रिमोट originको हेड टू ब्रांच में बदलना developहोगा:

git remote set-head origin develop


क्या इस सुविधा को सर्वर पर हाल के संस्करण की आवश्यकता है या क्या यह पर्याप्त है यदि ग्राहक मशीन ने हाल ही में गिट स्थापित किया है?
मिक्को रेंटालीनें

3
@ टॉर्चर सही है लेकिन सही है; इस जवाब को नीचा दिखाना चाहिए। Git में "रिमोट के लिए स्थानीय, डिफ़ॉल्ट शाखा" की यह कुछ भ्रामक अवधारणा है। यह आपको "मूल / डिफॉल्टब्रंच" के बजाय "मूल" टाइप करने देता है और एक शुद्ध क्लाइंट-साइड चीज़ है। Git-scm.com/docs/git-remote # सेट-हेड पर लंबी कहानी
मार्श

1
यह पुष्टि करने के लिए कि @MarchH किस बारे में बात कर रहा है: चलाएँ git checkout -b default; git push origin HEAD; git remote set-head origin default। आप इसके साथ स्थानीय परिवर्तनों का निरीक्षण कर सकते हैं cat .git/refs/remotes/origin/HEAD(यह होना चाहिए ref: refs/remotes/origin/default), और दूरस्थ परिवर्तनों की कमी के साथ git remote show origin(यह अभी भी जो कुछ भी आप डिफ़ॉल्ट शाखा को जोड़ने से पहले था) होगा।
डे नोवो

37

चूंकि आप GitHub का उल्लेख करते हैं, इसलिए इसे अपनी साइट पर करने के लिए बस अपनी परियोजना में जाएं, फिर ...

admin > Default Branch > (choose something)

किया हुआ।


1
अति उत्कृष्ट! वह आखिरी गुम सा था।
बर्कस

मेरा मूल / HEAD पहले से ही मास्टर की बजाय एक सुविधा शाखा को इंगित करता है। मैंने "मुख्य शाखा" को आगे और पीछे बदलने की कोशिश की, लेकिन इसने HEAD को प्रभावित नहीं किया ... कोई सुझाव?
डेनियल श्वेलेव

3
सेटिंग्स> शाखाओं> डिफ़ॉल्ट शाखा
चुन यांग

12

देखें: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

यह git रिपॉजिटरी में डिफ़ॉल्ट ब्रांच सेट करता है। आप इसे नंगे या प्रतिबिंबित रिपॉजिटरी में चला सकते हैं।

उपयोग:

$ git symbolic-ref HEAD refs/heads/<branch name>

6
$ git प्रतीकात्मक रेफरी HEAD refs / प्रमुख / नाम-की-शाखा
Lamy

मैंने अपने रिमोट रेपो में यह किया और इसने मेरी समस्याओं को क्लोन किया, जहां किसी कारण से सिर एक और शाखा का नाम था और इसलिए मास्टर को क्लोन करने की कोशिश करते हुए संगीतकार में मास्टर को बंद करने की कोशिश में एक त्रुटि होगी, यह इस परिदृश्य के लिए बहुत विशिष्ट हो सकता है , लेकिन अन्य लोग उस स्थिति में हो सकते हैं और सोच रहे हैं कि क्या करना है
क्रिस्टोफर थॉमस

10

(पहले से ही मूल रूप से एक ही सवाल था " दूरस्थ रिपॉजिटरी में एक गिट प्रतीकात्मक रेफरी बनाएं ", जिसे कोई सार्वभौमिक जवाब नहीं मिला।)

लेकिन विभिन्न गिट "खेतों" के लिए एक विशिष्ट उत्तर हैं (जहां कई उपयोगकर्ता एक प्रतिबंधित इंटरफ़ेस के माध्यम से गिट रिपोस का प्रबंधन कर सकते हैं: http और ssh के माध्यम से): http://Github.com , http://Gitorious.org , http: / /repo.or.cz , गिरार ( http://git.altlinux.org )।

इस पृष्ठ को पढ़ने और इन विशिष्ट सेवाओं के बारे में सोचने वालों के लिए ये विशिष्ट उत्तर उपयोगी हो सकते हैं।


4
अब उनके पास repo.or.cz पर HEAD शाखा का चयन करने के लिए एक ड्रॉप-डाउन मेनू है (उदाहरण: repo.or.cz/editproj.cgi?name=for-me-and-for-all_imz.git ) और gitor.org.org , भी। महान!
इम्ज़ - इवान ज़खरीशेव

7

यदि आपके पास शेल से रिमोट रेपो तक पहुंच है, तो बस .it में जाएं (या मुख्य डायर अगर इसकी नंगी रेपो है) और हेडड को सही हेड को इंगित करने के लिए फ़ाइल बदलें। उदाहरण के लिए, डिफ़ॉल्ट रूप से इसमें हमेशा 'refs: refs / heads / master' होता है, लेकिन अगर आपको इसके बजाय HEAD होने की आवश्यकता है, तो बस HEAD फ़ाइल को संपादित करें और सामग्री को 'refs: refs / heads / foo' में बदलें।


मेरे पास Git सर्वर पर व्यवस्थापक अधिकार हैं और मैंने बिल्कुल वैसा ही किया। हम Gitolite का उपयोग करते हैं और मैं रिपॉजिटरी में चला गया जो मैंने बनाई थी। निर्देशिका नाम है myrepo.git। दी निर्देशिका में प्रमुख फ़ाइल की सामग्री से बदल गया था ref: refs/heads/masterकरने के लिए ref: refs/heads/mainline। अब, जब मैं अपने स्थानीय बॉक्स पर भंडार को क्लोन करने की कोशिश करता हूं, तो यह अभी भी मास्टर को इंगित करता है। मैंने git clone ssh://gitolite@git.server/myrepoकमान संभाली। इस तरह के व्यवहार के लिए कोई विचार?
टेक्नेक्स्ट

Git सर्वर संस्करण: git version 1.7.1और Git क्लाइंट संस्करण:git version 1.9.4.msysgit.2
तकनीक

5

आप केवल चीनी मिट्टी के बरतन गिट कमांड का उपयोग करके एक अलग मास्टर शाखा बना सकते हैं :

git init
touch GO_AWAY
git add GO_AWAY
git commit -m "GO AWAY - this branch is detached from reality"

जो हमें अशिष्ट संदेश के साथ एक मास्टर शाखा देता है (आप अधिक विनम्र होना चाहते हैं)। अब हम अपनी "वास्तविक" शाखा बनाते हैं (आइए इसे SVN के सम्मान में ट्रंक कहते हैं ) और इसे मास्टर से तलाक दें :

git checkout -b trunk
git rm GO_AWAY
git commit --amend --allow-empty -m "initial commit on detached trunk"

प्रेस्टो, तुमसे मिलके ख़ुशी हुई! gitk --all उनके बीच कोई लिंक नहीं होने के साथ मास्टर और ट्रंक दिखाएगा ।

"जादू" यहाँ यह है कि --amend कारणों Git प्रतिबद्ध एक नया बनाने के लिए वर्तमान प्रधान के रूप में ही माता पिता के साथ प्रतिबद्ध है, तो यह करने के लिए प्रमुख बिंदु हैं। लेकिन वर्तमान HEAD के पास माता-पिता नहीं है क्योंकि यह भंडार में प्रारंभिक प्रतिबद्ध है, इसलिए नए HEAD को एक भी नहीं मिलता है, जिससे वे एक दूसरे से अलग हो जाते हैं।

पुराने हेड प्रतिबद्ध जीआईटी-जीसी द्वारा हटाए नहीं जाते हैं क्योंकि रेफ / हेड / मास्टर अभी भी इसे इंगित करते हैं।

--Allow-खाली झंडा केवल जरूरत है क्योंकि हम एक खाली पेड़ के लिए प्रतिबद्ध हैं है। अगर git rm के बाद कुछ git ऐड होते हैं तो यह आवश्यक नहीं होगा।

सच में, आप किसी भी समय एक रिपॉजिटरी ब्रांच बना सकते हैं, रिपॉजिटरी में शुरुआती कमिटमेंट को ब्रांच करके, उसके ट्री को डिलीट करके, अपने डिटैच्ड ट्री को जोड़कर, फिर git कमिट कर सकते हैं --amend

मुझे पता है कि यह इस सवाल का जवाब नहीं देता है कि रिमोट रिपॉजिटरी पर डिफ़ॉल्ट शाखा को कैसे संशोधित किया जाए, लेकिन यह एक अलग शाखा बनाने के तरीके पर एक साफ जवाब देता है।


1
आप किसी अन्य रेपो से असंबंधित शाखा प्राप्त करके और इसे एक नाम देकर एक अलग शाखा को आसान बना सकते हैं। उदाहरण के लिए, git fetch git:user@example.com:foo remote-branch-name && git checkout -b detached-branch FETCH_HEADनई शाखा को जोड़ेगा जो रिमोट में detached-branchशाखा से मेल खाती है । बेशक, "रिमोट" आपके द्वारा पहले तैयार की गई स्थानीय फ़ाइल प्रणाली में एक भंडार हो सकता है। remote-branch-namegit:user@example.com:foo
मिकको रेंटालिनेन

2

सबसे पहले, नई शाखा बनाएं जिसे आप अपने डिफ़ॉल्ट के रूप में सेट करना चाहते हैं, उदाहरण के लिए:

$>git branch main

इसके बाद, उस शाखा को मूल पर धकेलें :

$>git push origin main

अब जब आप अपने GitHub खाते में प्रवेश करते हैं, तो आप अपने भंडार में जा सकते हैं और सेटिंग्स> डिफ़ॉल्ट शाखा चुन सकते हैं और " मुख्य " चुन सकते हैं ।

फिर, यदि आप ऐसा चुनते हैं, तो आप मास्टर शाखा को हटा सकते हैं:

$>git push origin :master


समझने की कुंजी यह है कि यदि आप प्रदाता (इस उदाहरण में GitHub) को होस्ट करते हैं, तो डिफ़ॉल्ट शाखा को संशोधित करने के लिए एक विधि प्रदान नहीं करता है, आप भाग्य से बाहर हैं। Git प्रोटोकॉल दूरस्थ डिफ़ॉल्ट शाखा को संशोधित करने के लिए एक सुविधा प्रदान नहीं करता है; आपको git symbolic-refदूरस्थ शेल पर चलने में सक्षम होना चाहिए या अन्यथा HEADदूरस्थ रिपॉजिटरी रूट निर्देशिका में पाठ फ़ाइल को संशोधित करने में सक्षम होना चाहिए ।
मिकको रेंटालिनेन

2

प्रश्न से संबंधित, मैं खोज करते समय यहां समाप्त हुआ:

मैं एक स्थानीय रेपो को GitHub पर परिवर्तित डिफ़ॉल्ट शाखा के बारे में कैसे पता करूँ

पूर्णता के लिए, उत्तर जोड़ना:

git remote set-head origin -a

0

जिओलाइट लोगों के लिए, जिलेटलाइट एक कमांड का समर्थन करता है जिसे - इसके लिए प्रतीक्षा करें - symbolic-ref। यह आपको उस कमांड को दूरस्थ रूप से चलाने की अनुमति देता है यदि आपके पास रेपो के लिए डब्ल्यू (लिखने) की अनुमति है।


-1

सरल सिर्फ अपने GitHub खाते में प्रवेश और नेविगेशन मेनू में अब तक सही पक्ष पर चुनें सेटिंग्स , में सेटिंग्स टैब का चयन डिफ़ॉल्ट शाखा और अपने भंडार है कि मेरे लिए चाल किया था के मुख्य पृष्ठ पर वापस लौटने।


1
हालांकि यह नई शाखा को GitHub इंटरफ़ेस में डिफ़ॉल्ट के रूप में दिखाता है, जब git क्लोन [रेपो] कर रहा है, तो मुझे वह शाखा नहीं मिल रही है। यानी .it / HEAD में गलत रेफरी है।
जोसेफ शीदी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.