Предположим, у вас есть репозиторий, на 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
ec2
пакет -launchpad.net/goamz/aws
импортный. И пакеты ,aws
иec2
пакеты находятся в ОДНОМ репозитории, поэтому при разветвлении не будут ссылаться на правильный пакет (тот, что находится в вилке).Ответы:
Для обработки запросов на вытягивание
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
? клон с вилки? клон из оригинала? изнутри идти?Если вы используете модули go . Вы можете использовать
replace
директивуИтак, вы можете сделать ниже в своем файле go.mod
где
v3.2.1
тег на вашем репо. Также можно сделать через CLIисточник
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
чья роль состоит в том, чтобы фактически заменить путь импорта для локальной разработки? Я имею в виду, что вы никогда не забудете удалить уродливую «замену», потому что вам не придется этого делать.Один из способов ее решения - предложенный Иваном Рейвом и http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html способ разветвления.
Другой - обойти поведение golang . Когда вы
go get
, golang размещает ваши каталоги под тем же именем, что и в URI репозитория, и здесь начинаются проблемы.Если вместо этого вы создадите свой собственный
git clone
, вы можете клонировать свой репозиторий в свою файловую систему по пути, названному в честь исходного репозитория.Предполагая, что исходный репозиторий есть
github.com/awsome-org/tool
и вы его разместилиgithub.com/awesome-you/tool
, вы можете:golang совершенно счастлив продолжить работу с этим репозиторием и на самом деле не заботится о том, чтобы какой-то верхний каталог имел имя,
awesome-org
а git remoteawesome-you
. Весь импорт дляawesome-org
возобновляется через только что созданный каталог, который является вашим локальным рабочим набором.Более подробно см. Мое сообщение в блоге: Разветвление репозиториев Golang на GitHub и управление путем импорта
изменить : фиксированный путь к каталогу
источник
Если ваш форк носит временный характер (то есть вы намереваетесь его объединить), просто выполняйте разработку на месте, например, в
$GOPATH/src/launchpad.net/goamz
.Затем вы используете функции системы контроля версий (например
git remote
), чтобы сделать исходный репозиторий вашим репозиторием, а не исходный.Это усложняет другим людям использование вашего репозитория,
go get
но намного упрощает его интеграцию в исходный код.На самом деле у меня есть репозиторий для goamz, для
lp:~nick-craig-wood/goamz/goamz
которого я разрабатываю именно так. Может, автор когда-нибудь сольет!источник
go get
из моего репо, все мои операторы импорта и тому подобное по-прежнему будут отражатьсяgithub.com/original_author
и, таким образом, будут нарушены ... правильно?Вот способ, который подходит всем:
Используйте github для создания ответвления на «my / repo» (просто пример):
Повторяйте каждый раз, когда будете улучшать код:
Зачем? Это позволяет вам иметь репо, с которым
go get
работает любой . Он также позволяет поддерживать и улучшать ветку, подходящую для запроса на вытягивание. Он не набивает git словом «vendor», он сохраняет историю, и инструменты сборки могут понять ее.источник
Ответ на этот вопрос заключается в том, что если вы разветвляете репо с несколькими пакетами, вам нужно будет переименовать все соответствующие пути импорта. Это в значительной степени хорошо, так как вы разделили все эти пакеты, и пути импорта должны это отражать.
источник
find
,xargs
иsed
, но это помогло бы иметь безболезненный рабочий процесс, который последовательно работает для всех.gomvpkg
может сделать переименование проще / лучше.go get golang.org/x/tools/cmd/gomvpkg
тогдаgomvpkg -help
.Чтобы автоматизировать этот процесс, я написал небольшой скрипт. Вы можете найти более подробную информацию в моем блоге, чтобы добавить команду типа "gofork" в ваш bash.
источник
golang
изменить наgofork
в строке 4?Совместное использование вендоров и подмодулей
import
операторы в исходном коде, чтобы они указывали на папку поставщика (безvendor/
префикса). Напримерvendor/bob/lib
=>import "bob/lib"
Например
Зачем
Это решает все проблемы, о которых я слышал и сталкивался, пытаясь понять это сам.
Больше информации
источник
в свой
Gopkg.toml
файл добавьте эти блоки нижеТаким образом, он будет использовать вилку
project2
вместоgithub.com/globalsign/mgo
источник
Gopkg.toml
только файл,dep
который в этом вопросе вообще не упоминается. Новые проекты Go должны вместо этого использовать модули Go (и существующие проекты IMO, основанные на dep, также должны быть перенесены).Вы можете использовать команду,
go get -f
чтобы получить разветвленное репоисточник