गो में फोर्कड पैकेज आयात का उपयोग करना


104

मान लीजिए कि आपके पास एक भंडार है github.com/someone/repoऔर आपने उसे कांटा है github.com/you/repo। आप मुख्य रेपो के बजाय अपने कांटे का उपयोग करना चाहते हैं, इसलिए आप ए

go get github.com/you/repo

अब इस रेपो में सभी आयात पथ "टूटे हुए" होंगे, मतलब, यदि रिपॉजिटरी में कई पैकेज हैं जो एक दूसरे को निरपेक्ष URL के माध्यम से संदर्भित करते हैं, तो वे स्रोत का संदर्भ देंगे, न कि कांटा।

क्या इसे सही तरीके से मैन्युअल रूप से क्लोन करने का एक बेहतर तरीका है?

git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo

1
नए कांटे में कोई आयात पथ नहीं तोड़ा जाएगा जो कि कांटे से पहले ही टूटे नहीं थे।
zzzz

11
आपको निराश करने के लिए क्षमा करें, लेकिन यह सच नहीं है। यदि किसी उप-पैकेज को पूर्ण url के माध्यम से आयात में संदर्भित किया जाता है, तो यह आयात कांटा में टूट जाएगा (या कम से कम गलत पैकेज को संदर्भित करता है)।
एरिक एगर

2
जैसे गोजम । इसमें सभी जगह आंतरिक संदर्भ हैं।
एरिक एगर

1
ec2पैकेज को देखो - इसका launchpad.net/goamz/awsआयात है। दोनों, awsऔर ec2संकुल SAME रिपॉजिटरी में रहते हैं, इसलिए जब कांटा जाता है, तो सही पैकेज (कांटा में एक) का संदर्भ नहीं होगा।
एरिक एगर

1
कांटा कांटा के स्रोत के समान पैकेज को संदर्भित करेगा। इसमें गलत क्या है? कांटा संकलित करेगा, यह निर्माण करेगा, यह पहले की तरह ही काम करेगा। फिर 'गलत पैकेज' की परिभाषा क्या है? ध्यान दें कि गो भाषा, इसलिए इसकी निर्माण प्रणाली में, रिपॉजिटरी के बारे में कोई जागरूकता नहीं है, केवल पैकेज हैं।
zzzz

जवाबों:


84

पुल अनुरोधों को संभालने के लिए

  • कांटा भंडार github.com/someone/repoकरने के लिएgithub.com/you/repo
  • मूल कोड डाउनलोड करें: go get github.com/someone/repo
  • वहाँ रहना: cd "$(go env GOPATH)/src"/github.com/someone/repo
  • अपने कांटे को अपलोड करने में सक्षम करें: git remote add myfork https://github.com/you/repo.git
  • अपने रेपो में अपने परिवर्तन अपलोड करें: git push myfork

http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html

अपने प्रोजेक्ट में पैकेज का उपयोग करने के लिए

https://github.com/golang/go/wiki/PackageManagementTools


मुझे किस फ़ोल्डर से करना चाहिए git remote add? कांटा से क्लोन? मूल से क्लोन? भीतर से?
लैपोट्स

1
@ लैपॉट ने मूल रेपो (यानी $ GOPATH / src / github.com / somone / repo) में
कमांड को चलाया

क्या होगा यदि मैं एक रेपो में परिवर्तन जोड़ना चाहता हूं जो बहुत पहले ही फोर्क हो गया था?
NA

61

यदि आप गो मॉड्यूल का उपयोग कर रहे हैं । आप replaceनिर्देश का उपयोग कर सकते हैं

replaceनिर्देश आप, या एक रिश्तेदार या पूर्ण फ़ाइल पथ के साथ अपने स्थानीय फाइल सिस्टम पर एक और आयात रास्ता है कि एक और VCS (GitHub या कहीं और) में स्थित मॉड्यूल हो सकता है की आपूर्ति के लिए अनुमति देता है। replaceनिर्देश से नया आयात पथ वास्तविक स्रोत कोड में आयात पथ को अपडेट करने की आवश्यकता के बिना उपयोग किया जाता है।

तो आप अपने go.mod फ़ाइल में नीचे कर सकते हैं

module github.com/yogeshlonkar/openapi-to-postman

go 1.12

require (
    github.com/someone/repo v1.20.0
)

replace github.com/someone/repo => github.com/you/repo v3.2.1

v3.2.1आपके रेपो पर टैग कहां है। सीएलआई के माध्यम से भी किया जा सकता है

go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1"

4
बढ़िया काम किया। मुझे लगता है कि इसका एकमात्र कारण अधिक अपवित्र नहीं है क्योंकि लोग अभी तक गो मॉड्यूल का उपयोग नहीं कर रहे हैं। मैंने इस ट्रिक का उपयोग अपने कार्य केंद्र पर एक अन्य स्थान पर फ़ाइल स्थान को इंगित करने के लिए भी किया था जहां मेरे पास स्थानीय संपादन थे जिन पर मैं काम कर रहा था। मैं सिर्फ अपने "प्रतिस्थापित" लाइन को हटा दूंगा एक बार जब मैं अपने स्थानीय संपादन को गिटब में धकेलूंगा।
lazieburd

^ 100% सहमत हैं। लोगों को वोट दें।
एंड्रयू एरो

2
ओह, लेकिन "मास्टर" ने मेरे लिए काम नहीं किया। मुझे v0.0.1 या वहां कुछ विशिष्ट संस्करण लिखना था।
एंड्रयू एरो

1
आप go mod edit -replace सीधे कमांड लाइन पर भी जा सकते हैं go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1":। दोनों @v...वैकल्पिक हैं।
जोएल पुर्रा

क्या यह अच्छा नहीं होगा go.mod.localया go.mod.devजिनकी भूमिका वास्तव में स्थानीय विकास के लिए आयात मार्ग को बदलने की है? मेरा मतलब है, आप बदसूरत "बदलें" को हटाना कभी नहीं भूलेंगे क्योंकि आपको ऐसा नहीं करना होगा।
मैनुअल

21

इसे हल करने का एक तरीका यह है कि इवान रवे और http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html द्वारा सुझाव दिया गया है - फोर्किंग का तरीका।

एक अन्य गोलगप्पे का व्यवहार है। जब आप go get, Golang रिपॉजिटरी URI के रूप में एक ही नाम के तहत अपनी निर्देशिकाओं को देता है , और यहीं से समस्या शुरू होती है।

यदि, इसके बजाय, आप अपना स्वयं का जारी करते हैं git clone, तो आप अपने रिपॉजिटरी को मूल रिपॉजिटरी के नाम पर एक पथ पर अपने फाइल सिस्टम पर क्लोन कर सकते हैं।

माना जाता है कि मूल भंडार में है github.com/awsome-org/toolऔर आप उस पर कांटा लगा github.com/awesome-you/toolसकते हैं:

cd $GOPATH
mkdir -p {src,bin,pkg}
mkdir -p src/github.com/awesome-org/
cd src/github.com/awesome-org/
git clone git@github.com:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git
cd tool/
go get ./...

गोलंग इस भंडार के साथ जारी रखने के लिए पूरी तरह से खुश है और वास्तव में कुछ ऊपरी निर्देशिका का नाम नहीं है, awesome-orgजबकि गिट रिमोट है awesome-youawesome-orgआपके द्वारा अभी-अभी बनाई गई निर्देशिका के माध्यम से सभी आयात को फिर से जोड़ा गया है, जो कि आपका स्थानीय कामकाजी सेट है।

अधिक लंबाई में, कृपया मेरे ब्लॉग पोस्ट को देखें: गिटहब पर गोलंग रिपॉजिटरी फोर्किंग और आयात पथ का प्रबंधन

संपादित करें : निश्चित निर्देशिका पथ


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

6

यदि आपका कांटा केवल अस्थायी है (अर्थात आप इसे विलय करना चाहते हैं) तो बस अपना विकास सीटू में करें, जैसे $GOPATH/src/launchpad.net/goamz

तब आप मूल नियंत्रण के git remoteबजाय अपस्ट्रीम रिपॉजिटरी को अपने रिपॉजिटरी बनाने के लिए संस्करण नियंत्रण प्रणाली (जैसे ) की सुविधाओं का उपयोग करते हैं ।

यह अन्य लोगों के लिए अपनी रिपॉजिटरी का उपयोग करना कठिन बनाता है, go getलेकिन इसके लिए अपस्ट्रीम को एकीकृत करना बहुत आसान है।

वास्तव में मेरे पास goamz के लिए एक भंडार है जिस पर lp:~nick-craig-wood/goamz/goamzमैं ठीक उसी तरह से विकास करता हूं। हो सकता है कि लेखक एक दिन उसमें विलीन हो जाए!


1
बस इसलिए मैं इसे करने के निहितार्थ को समझता हूं, अगर मैं इस मार्ग पर चला गया, जब कोई go getमेरे रेपो से करता है , मेरे सभी आयात कथन और ऐसे अभी भी प्रतिबिंबित होंगे github.com/original_authorऔर इस तरह टूट जाएंगे ... सही है?
पार्कर.सिक्कंड

@ parker.sikand हाँ जो सही है। यह तकनीक आपके द्वारा मर्ज किए गए अपस्ट्रीम प्राप्त करने के लिए उपयोग किए जाने वाले सामान के लिए सर्वोत्तम है, न कि उपयोग के लिए। यदि आप पैकेज को स्थायी रूप से कांटा करने का इरादा रखते हैं तो दूसरे उत्तर की तकनीक का उपयोग करें।
निक क्रेग-वुड

4

यहाँ एक तरीका है जो सभी के लिए काम करता है:

"मेरा / रेपो" (केवल एक उदाहरण) के लिए कांटा का उपयोग करें:

go get github.com/my/repo
cd ~/go/src/github.com/my/repo
git branch enhancement
rm -rf .
go get github.com/golang/tools/cmd/gomvpkg/…
gomvpkg <<oldrepo>> ~/go/src/github.com/my/repo
git commit

जब आप कोड को बेहतर बनाते हैं तो हर बार दोहराएं:

git commit
git checkout enhancement
git cherry-pick <<commit_id>>
git checkout master

क्यों? इससे आपको अपना रेपो मिलता है जो किसी भी go getकाम करता है। यह आपको एक शाखा को बनाए रखने और बढ़ाने की सुविधा भी देता है जो पुल अनुरोध के लिए अच्छा है। यह "विक्रेता" के साथ गिट नहीं फूटता है, यह इतिहास को संरक्षित करता है, और निर्माण उपकरण इसका अर्थ बना सकता है।


थोड़ा सुधार: चलाएं github.com/golang/tools/cmd/gomvpkg/main.go और यह आदेश .it को स्थानांतरित करता है, इसलिए उस अन्यत्र को सहेजें और बाद में इसे पुनर्स्थापित करें।
user1212212

यह भी संभव है कि सिर्फ mvan-golang प्लगइन का उपयोग करें जो निर्भरता के प्रसंस्करण में कुछ स्वचालन बनाता है जैसे उदाहरण github.com/raydac/mvn-golang/tree/master/mvn-golang-examples-…
इगोर मजनित्सा

3

इसका उत्तर यह है कि यदि आप कई पैकेजों के साथ एक रेपो खरीदते हैं, तो आपको सभी प्रासंगिक आयात पथों का नाम बदलना होगा। यह काफी हद तक एक अच्छी बात है क्योंकि आप उन सभी पैकेजों को भूल गए हैं और आयात रास्तों को यह प्रतिबिंबित करना चाहिए।


3
मैंने गो परियोजना के लिए अपने पहले योगदान में इसका निदान करने की तुलना में अधिक समय जलाया। "सभी परीक्षण पास हैं, जिनमें से मैंने लिखा है कि मैंने नई कार्यक्षमता का परीक्षण किया है। क्या गलत है ?!" क्या आप शुरुआती लोगों के लिए इस कठिन बिंदु को कम करने के लिए किसी भी उपलब्ध टूलिंग के बारे में जानते हैं?
ऋषि मिशेल

3
एक बार मैं यह पता लगा इसे प्रयोग हल करने के लिए आसान था find, xargsहै, और sed, लेकिन यह एक दर्द से मुक्त कार्यप्रवाह है कि लगातार हर किसी के लिए काम करता है के लिए मदद मिलेगी।
ऋषि मिशेल

@JakeMitchell gomvpkgनाम को आसान / बेहतर कर सकता है। go get golang.org/x/tools/cmd/gomvpkgतब gomvpkg -help
डेव सी

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

8
क्या यह अभी भी गो-लैंग काम कर रहा है? यह सिर्फ इतना पागल है, कि यह मजाकिया नहीं है ... या तो अपस्ट्रीम-फ्रेंडली हो, या डाउन-फ्रेंडली हो, लेकिन दोनों नहीं। यह मेरी बहुत विनम्र राय नहीं है, शायद बहुत अधिक क्रॉस-प्रोजेक्ट्स में सहयोग नहीं करने वाले लोगों द्वारा किया गया एक बहुत बड़ा दोष है। # फेल # गोल्ड
निकल्स हेडमैन

1

इस प्रक्रिया को स्वचालित करने के लिए, मैंने एक छोटी स्क्रिप्ट लिखी। आप अपने ब्लॉग पर "bofork" जैसी कमांड को अपने बैश में जोड़ने के लिए अधिक जानकारी पा सकते हैं ।

function gofork() {
  if [ $# -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; then
    echo 'Usage: gofork yourFork originalModule'
    echo 'Example: gofork github.com/YourName/go-contrib github.com/heirko/go-contrib'
    return
  fi
   echo "Go get fork $1 and replace $2 in GOPATH: $GOPATH"
   go get $1
   go get $2
   currentDir=$PWD
   cd $GOPATH/src/$1
   remote1=$(git config --get remote.origin.url)
   cd $GOPATH/src/$2
   remote2=$(git config --get remote.origin.url)
   cd $currentDir
   rm -rf $GOPATH/src/$2
   mv $GOPATH/src/$1 $GOPATH/src/$2
   cd $GOPATH/src/$2
   git remote add their $remote2
   echo Now in $GOPATH/src/$2 origin remote is $remote1
   echo And in $GOPATH/src/$2 their remote is $remote2
   cd $currentDir
}

export -f gofork

लाइन 4 में golangबदला जाना चाहिए gofork?
डैन तेनबाम

अच्छी तरह से देखा! ठीक कर!
हिरोलाइट

1

वेंडरिंग और सबमॉड्यूल्स का एक साथ उपयोग करें

  1. जीथब पर कांटा (इस मामले में mssqldb)
  2. एक सबमॉड्यूल जोड़ें जो आपके फोर्क को आपके वेंडर फोल्डर में क्लोन करता है लेकिन अपस्ट्रीम रेपो का रास्ता है
  3. importविक्रेता स्रोत को इंगित करने के लिए अपने स्रोत कोड में अपने बयानों को अपडेट करें , ( vendor/उपसर्ग सहित नहीं )। जैसे vendor/bob/lib=>import "bob/lib"

उदाहरण के लिए

cd ~/go/src/github.com/myproj

mygithubuser=timabell
upstreamgithubuser=denisenkom
librepo=go-mssqldb

git submodule add "git@github.com:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"

क्यों

यह उन सभी समस्याओं को हल करता है , जिनके बारे में मैंने सुना है और यह पता लगाने की कोशिश करते हुए खुद सामने आता हूं।

  • आंतरिक पैकेज रेफरी में अब काम करते हैं क्योंकि मार्ग ऊपर से अपरिवर्तित है
  • आपके प्रोजेक्ट का एक नया चेकआउट काम करता है क्योंकि सबमॉड्यूल सिस्टम इसे आपके फोर्क से दायीं ओर मिलता है लेकिन अपस्ट्रीम फ़ोल्डर पथ में
  • आपको टूलींग के साथ मैन्युअल रूप से पथ या मेस को जानने की आवश्यकता नहीं है।

और जानकारी


0

अपनी Gopkg.tomlफ़ाइल में इन ब्लॉक को नीचे जोड़ें

[[constraint]]
  name = "github.com/globalsign/mgo"
  branch = "master"
  source = "github.com/myfork/project2"

तो यह project2जगह में कांटे का उपयोग करेगाgithub.com/globalsign/mgo


Gopkg.tomlफ़ाइल केवल प्रयोग किया जाता है के द्वारा depजो इस सवाल का बिल्कुल भी उल्लेख नहीं है। नई गो परियोजनाओं के बजाय गो मॉड्यूल का उपयोग किया जाना चाहिए (और आईएमओ मौजूदा डिपो आधारित परियोजनाओं को भी पलायन करना चाहिए)।
डेव सी

मैं इस dep सुविधा के बारे में नहीं जानता था, और आपके उत्तर ने निश्चित रूप से मेरी मदद की :) :)
Veger

0

आप go get -fएक फोर्क्ड रेपो पाने के लिए कमांड का उपयोग कर सकते हैं

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