Angenommen, Sie haben ein Repository in github.com/someone/repo
und geben es an github.com/you/repo
. Sie möchten Ihre Gabel anstelle des Haupt-Repos verwenden, also tun Sie a
go get github.com/you/repo
Jetzt werden alle Importpfade in diesem Repo "unterbrochen". Wenn sich also mehrere Pakete im Repository befinden, die über absolute URLs aufeinander verweisen, verweisen sie auf die Quelle und nicht auf die Abzweigung.
Gibt es einen besseren Weg, als es manuell in den richtigen Pfad zu klonen?
git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo
ec2
Paket an - es hat einenlaunchpad.net/goamz/aws
Import. Sowohl dasaws
als auch dasec2
Paket befinden sich im SAME-Repository. Wenn es also gegabelt wird, verweist es nicht auf das richtige Paket (das in der Gabelung).Antworten:
Pull-Anfragen bearbeiten
github.com/someone/repo
zugithub.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
So verwenden Sie ein Paket in Ihrem Projekt
https://github.com/golang/go/wiki/PackageManagementTools
quelle
git remote add
? Klon von der Gabel? Klon vom Original? von innen gehen?Wenn Sie go-Module verwenden . Sie könnten die
replace
Direktive verwendenSie können dies also unten in Ihrer go.mod-Datei tun
Wo
v3.2.1
ist das Tag auf deinem Repo? Kann auch über die CLI erfolgenquelle
go mod edit -replace
direkt über die Befehlszeile :go mod edit -replace="github.com/someone/[email protected]=github.com/you/[email protected]"
. Beide@v...
sind optional.go.mod.local
odergo.mod.dev
deren Aufgabe es ist, den Importpfad für die lokale Entwicklung tatsächlich zu ersetzen? Ich meine, Sie würden nie vergessen, das hässliche "Ersetzen" zu entfernen, weil Sie es nicht müssten.Eine Möglichkeit, dies zu lösen, ist die von Ivan Rave und http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html vorgeschlagene Methode zum Gabeln.
Eine andere Möglichkeit besteht darin, das Golang- Verhalten zu umgehen . Wenn Sie
go get
, golang Ihre Verzeichnisse unter demselben Namen enthalten, wie es in dem Repository - URI und das ist , wo das Problem beginnt.Wenn Sie stattdessen Ihr eigenes
git clone
Repository ausgeben , können Sie Ihr Repository unter einem Pfad, der nach dem ursprünglichen Repository benannt ist, auf Ihr Dateisystem klonen.Angenommen, das ursprüngliche Repository befindet sich
github.com/awsome-org/tool
und Sie teilen es aufgithub.com/awesome-you/tool
, können Sie:golang ist vollkommen glücklich, mit diesem Repository fortzufahren, und es ist ihm eigentlich egal, ob ein oberes Verzeichnis den Namen hat,
awesome-org
während sich die Git-Fernbedienung befindetawesome-you
. Alle Importe fürawesome-org
werden über das soeben erstellte Verzeichnis, das Ihr lokaler Arbeitssatz ist, erneut erstellt.Weitere Informationen finden Sie in meinem Blogbeitrag: Forken von Golang-Repositorys auf GitHub und Verwalten des Importpfads
edit : fester Verzeichnispfad
quelle
Wenn Ihre Gabel nur vorübergehend ist (dh Sie beabsichtigen, sie zusammenzuführen), führen Sie Ihre Entwicklung einfach in situ durch, z
$GOPATH/src/launchpad.net/goamz
.Anschließend verwenden Sie die Funktionen des Versionskontrollsystems (z. B.
git remote
), um das Upstream-Repository zu Ihrem Repository und nicht zum ursprünglichen Repository zu machen.Dies erschwert es anderen Personen, Ihr Repository zu verwenden
go get
, erleichtert jedoch die Integration in das Upstream.Tatsächlich habe ich ein Repository für Goamz
lp:~nick-craig-wood/goamz/goamz
, für das ich genau so entwickle. Vielleicht wird der Autor es eines Tages zusammenführen!quelle
go get
aus meinem Repo macht, werden alle meine Importanweisungen und dergleichen immer noch reflektiertgithub.com/original_author
und somit gebrochen ... richtig?Hier ist ein Weg, der für alle funktioniert:
Verwenden Sie Github, um zu "my / repo" zu wechseln (nur ein Beispiel):
Wiederholen Sie diesen Vorgang jedes Mal, wenn Sie den Code verbessern:
Warum? Auf diese Weise können Sie Ihr Repo haben, mit dem jedes
go get
funktioniert. Außerdem können Sie einen Zweig pflegen und erweitern, der für eine Pull-Anfrage geeignet ist. Es bläht sich nicht mit "Vendor" auf, es bewahrt die Geschichte und Build-Tools können Sinn machen.quelle
Die Antwort darauf lautet: Wenn Sie ein Repo mit mehreren Paketen teilen, müssen Sie alle relevanten Importpfade umbenennen. Dies ist größtenteils eine gute Sache, da Sie alle diese Pakete gegabelt haben und die Importpfade dies widerspiegeln sollten.
quelle
find
,xargs
undsed
, aber es würde helfen , einen schmerzfreien Workflow haben , dass konsequent für alle funktioniert.gomvpkg
kann die Umbenennung einfacher / besser machen.go get golang.org/x/tools/cmd/gomvpkg
danngomvpkg -help
.Um diesen Prozess zu automatisieren, habe ich ein kleines Skript geschrieben. Weitere Details finden Sie in meinem Blog , um Ihrer Bash einen Befehl wie "gofork" hinzuzufügen.
quelle
golang
geändert werdengofork
?Verwenden Sie Vendoring und Submodule zusammen
import
Anweisungen in Ihrem Quellcode so, dass sie auf den Herstellerordner verweisen (ohnevendor/
Präfix). ZBvendor/bob/lib
=>import "bob/lib"
Z.B
Warum
Dies löst alle Probleme, von denen ich gehört habe und auf die ich gestoßen bin, während ich versucht habe, dies selbst herauszufinden.
Mehr Info
quelle
Fügen Sie in Ihrer
Gopkg.toml
Datei diesen Block unten hinzuAlso wird es die Gabel
project2
anstelle von verwendengithub.com/globalsign/mgo
quelle
Gopkg.toml
Datei wird nur verwendet, wenndep
diese Frage überhaupt nicht erwähnt wird. Neue Go-Projekte sollten stattdessen Go-Module verwenden (und IMO-vorhandene dep-basierte Projekte sollten ebenfalls migriert werden).Sie können den Befehl verwenden
go get -f
, um ein gegabeltes Repo zu erhaltenquelle