Suponha que você tenha um repositório em github.com/someone/repo
e faça um fork dele github.com/you/repo
. Você deseja usar seu fork em vez do repo principal, então você faz um
go get github.com/you/repo
Agora, todos os caminhos de importação neste repositório serão "quebrados", o que significa que, se houver vários pacotes no repositório que fazem referência uns aos outros por meio de URLs absolutos, eles farão referência à fonte, não ao fork.
Existe uma maneira melhor do que cloná-lo manualmente no caminho certo?
git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo
ec2
pacote - ele tem umalaunchpad.net/goamz/aws
importação. Ambos, oaws
e osec2
pacotes residem no SAME repositório, portanto, quando bifurcados, não farão referência ao pacote correto (aquele na bifurcação).Respostas:
Para lidar com solicitações pull
github.com/someone/repo
paragithub.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
Para usar um pacote em seu projeto
https://github.com/golang/go/wiki/PackageManagementTools
fonte
git remote add
? clone do garfo? clone do original? de dentro, vá?Se você estiver usando módulos go . Você poderia usar
replace
diretivaEntão, você pode fazer abaixo em seu arquivo go.mod
onde
v3.2.1
está a tag no seu repo. Também pode ser feito através do CLIfonte
go mod edit -replace
diretamente na linha de comando:go mod edit -replace="github.com/someone/[email protected]=github.com/you/[email protected]"
. Ambos@v...
são opcionais.go.mod.local
ougo.mod.dev
cujo papel é realmente substituir o caminho de importação para o desenvolvimento local? Quero dizer, você nunca se esqueceria de remover o feio "substituir" porque não seria necessário.Uma maneira de resolver isso é aquela sugerida por Ivan Rave e http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html - a forma de bifurcação.
Outra é contornar o comportamento do golang . Quando você
go get
, golang organiza seus diretórios com o mesmo nome do URI do repositório, e é aí que o problema começa.Se, em vez disso, você emitir o seu próprio
git clone
, poderá clonar seu repositório em seu sistema de arquivos em um caminho com o nome do repositório original.Supondo que o repositório original esteja dentro
github.com/awsome-org/tool
e você o bifurquegithub.com/awesome-you/tool
, você pode:golang está perfeitamente feliz em continuar com este repositório e realmente não se importa se algum diretório superior tem o nome
awesome-org
enquanto o remoto git estáawesome-you
. Todas as importações deawesome-org
são resolvidas por meio do diretório que você acabou de criar, que é o seu conjunto de trabalho local.Mais extensamente, por favor, veja minha postagem no blog: Bifurcando repositórios Golang no GitHub e gerenciando o caminho de importação
editar : caminho de diretório fixo
fonte
Se o seu fork for apenas temporário (ou seja, você pretende que ele seja mesclado), faça o seu desenvolvimento in situ, por exemplo, em
$GOPATH/src/launchpad.net/goamz
.Em seguida, você usa os recursos do sistema de controle de versão (por exemplo
git remote
) para tornar o repositório upstream o seu repositório, em vez do original.Torna mais difícil para outras pessoas usarem seu repositório,
go get
mas muito mais fácil para ele ser integrado ao upstream.Na verdade, tenho um repositório para goamz no
lp:~nick-craig-wood/goamz/goamz
qual desenvolvo exatamente dessa forma. Talvez o autor o mescle um dia!fonte
go get
partir do meu repo, todas as minhas declarações de importação ainda refletirãogithub.com/original_author
e, portanto, serão quebradas ... correto?Esta é uma maneira de fazer isso funcionar para todos:
Use o github para fazer um fork de "my / repo" (apenas um exemplo):
Repita cada vez que tornar o código melhor:
Por quê? Isso permite que você tenha seu repo com o qual todos possam
go get
trabalhar. Também permite manter e aprimorar um branch que é bom para uma solicitação pull. Não incha o git com "fornecedor", preserva a história e as ferramentas de construção podem dar sentido a isso.fonte
A resposta para isso é que se você bifurcar um repositório com vários pacotes, precisará renomear todos os caminhos de importação relevantes. Isso é muito bom, já que você fez um fork de todos os pacotes e os caminhos de importação devem refletir isso.
fonte
find
,xargs
esed
, mas ajudaria a ter um fluxo de trabalho sem problemas que funcione de forma consistente para todos.gomvpkg
pode fazer a renomeação mais fácil / melhor.go get golang.org/x/tools/cmd/gomvpkg
entãogomvpkg -help
.Para automatizar esse processo, escrevi um pequeno script. Você pode encontrar mais detalhes no meu blog para adicionar um comando como "gofork" ao seu bash.
fonte
golang
ser alterado para agofork
linha 4?Use venda e submódulos juntos
import
instruções em seu código-fonte para apontar para a pasta do fornecedor (sem incluir ovendor/
prefixo). Exvendor/bob/lib
=>import "bob/lib"
Por exemplo
Por quê
Isso resolve todos os problemas que ouvi e deparei ao tentar descobrir sozinho.
Mais informações
fonte
em seu
Gopkg.toml
arquivo adicione estes blocos abaixoPortanto, ele usará o bifurcado
project2
no lugar degithub.com/globalsign/mgo
fonte
Gopkg.toml
arquivo é usado apenasdep
quando esta questão não menciona nada. Os novos projetos Go devem usar módulos Go (e os projetos baseados em dep existentes da IMO também devem migrar).Você pode usar o comando
go get -f
para obter um repositório bifurcadofonte