138 votes

Utilisation de l'importation de paquets en fourche dans Go

Supposons que vous ayez un référentiel à github.com/someone/repo et vous le bifurquez vers github.com/you/repo . Vous voulez utiliser votre fork au lieu du repo principal, donc vous faites un

go get github.com/you/repo

Maintenant, tous les chemins d'importation dans ce dépôt seront "cassés", ce qui signifie que s'il y a plusieurs paquets dans le dépôt qui se réfèrent les uns aux autres via des URLs absolues, ils référenceront la source, et non la bifurcation.

Existe-t-il un meilleur moyen que de le cloner manuellement dans le bon chemin ?

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

162voto

Yogi Points 1021

Si vous utilisez modules d'accès . Vous pouvez utiliser replace directive

El replace vous permet de fournir un autre chemin d'importation qui pourrait être un autre module situé dans VCS (GitHub ou ailleurs), ou sur votre système de fichiers local avec un chemin de fichier relatif ou absolu. Le nouveau chemin d'importation de la directive replace est utilisée sans qu'il soit nécessaire de mettre à jour la directive chemins d'importation dans le code source réel.

Vous pourriez donc faire ce qui suit dans votre fichier go.mod

module some-project

go 1.12

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

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

donde v3.2.1 est un tag sur votre repo. Peut aussi être fait par CLI

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

86voto

Ivan Rave Points 51

Pour gérer les demandes de pull

  • bifurquer un dépôt github.com/someone/repo à github.com/you/repo
  • télécharger le code original : go get github.com/someone/repo
  • être là : cd "$(go env GOPATH)/src"/github.com/someone/repo
  • permettre le téléchargement sur votre fork : git remote add myfork https://github.com/you/repo.git
  • téléchargez vos modifications dans votre dépôt : git push myfork

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

Pour utiliser un paquet dans votre projet

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

20voto

Shlomi Noach Points 2652

Une façon de le résoudre est celle suggérée par Ivan Rave et http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html -- la voie de la bifurcation.

Une autre solution consiste à contourner le golang comportement. Lorsque vous go get , golang placez vos répertoires sous le même nom que dans l'URI du référentiel, et c'est là que les problèmes commencent.

Si, au lieu de cela, vous émettez votre propre git clone vous pouvez cloner votre référentiel sur votre système de fichiers sur un chemin nommé d'après le référentiel d'origine.

En supposant que le dépôt d'origine se trouve dans github.com/awsome-org/tool et tu le mets sur github.com/awesome-you/tool vous pouvez :

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 ./...

golang est parfaitement heureux de continuer avec ce dépôt et ne se soucie pas vraiment qu'un répertoire supérieur porte le nom de awesome-org alors que le git distant est awesome-you . Toutes les importations pour awesome-org sont résovés via le répertoire que vous venez de créer, qui est votre ensemble de travail local.

Pour plus de détails, veuillez consulter mon article de blog : Forking des dépôts Golang sur GitHub et gestion du chemin d'importation

modifier : correction du chemin du répertoire

4voto

Nick Craig-Wood Points 18742

Si votre fork n'est que temporaire (c'est-à-dire que vous avez l'intention de le fusionner), faites simplement votre développement in situ, par exemple dans $GOPATH/src/launchpad.net/goamz .

Vous utilisez ensuite les fonctionnalités du système de contrôle de version (ex. git remote ) pour faire du dépôt amont votre dépôt plutôt que le dépôt d'origine.

Cela rend plus difficile pour d'autres personnes d'utiliser votre dépôt avec go get mais beaucoup plus facile à intégrer en amont.

En fait, j'ai un dépôt pour goamz à l'adresse suivante lp:~nick-craig-wood/goamz/goamz que je développe exactement de cette façon. Peut-être que l'auteur le fusionnera un jour !

3voto

user1212212 Points 41

Voici une méthode qui fonctionne pour tout le monde :

Utilisez github pour bifurquer vers "my/repo" (juste un exemple) :

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

Répétez chaque fois que vous améliorez le code :

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

Pourquoi ? Cela vous permet d'avoir votre repo que n'importe qui go get fonctionne avec. Il vous permet également de maintenir et d'améliorer une branche qui est bonne pour une demande de retrait. Il n'alourdit pas git avec des "vendeurs", il préserve l'historique et les outils de construction peuvent lui donner un sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X