Использование импорта раздвоенных пакетов в Go
предположим, что у вас есть репозиторий в github.com/someone/repo и вы раскошелитесь на github.com/you/repo. Вы хотите использовать свою вилку вместо основного РЕПО, поэтому вы делаете
go get github.com/you/repo
теперь все пути импорта в этом РЕПО будут "сломаны", то есть, если в репозитории есть несколько пакетов, которые ссылаются друг на друга через абсолютные URL-адреса, они будут ссылаться на источник, а не на вилку.
есть ли лучший способ, как клонирование вручную в правильном пути?
git clone [email protected]:you/repo.git $GOPATH/src/github.com/someone/repo
7 ответов:
для обработки запросов на вытягивание
- fork репозиторий: github.com/someone/repo к github.com/you/repo
- получить исходный код:
go get github.com/someone/repo- добавить пульт в репо:
git remote add myfork https://github.com/you/repo.git- толкать свои изменения:
git push myforkhttp://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html
для использования пакета в вашем проект
один из способов решить это, что предложил Иван рейв и 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вы можете:cd $GOPATH mkdir -p {src,bin,pkg} mkdir -p src/github.com/awesome-org/ cd src/github.com/awesome-org/ git clone [email protected]:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git cd tool/ go get ./...golang совершенно счастлив продолжить работу с этим репозиторием и на самом деле не волнует, что какой-то верхний каталог имеет имя
awesome-orgв то время как git remoteawesome-you. Весь импорт дляawesome-orgresovled через каталог, который вы только что создали, который является вашим локальным рабочим набор.более подробно, пожалуйста, смотрите мой блог:разветвление репозиториев Golang на GitHub и управление путем импорта
edit: исправлен путь к каталогу
если ваша вилка только временная (т. е. вы намереваетесь, чтобы она была объединена) , то просто сделайте свою разработку на месте, например, в
$GOPATH/src/launchpad.net/goamz.затем вы используете функции системы контроля версий (например,
git remote) чтобы сделать вышестоящий репозиторий вашим репозиторием, а не оригинальным.это делает его более трудным для других людей, чтобы использовать свой репозиторий с
go getно гораздо проще для него быть интегрированы вверх по течению.на самом деле у меня есть репозиторий для goamz at
lp:~nick-craig-wood/goamz/goamzкоторый я разрабатываю именно таким образом. Может быть, автор сольет его в один прекрасный день!
ответ на это заключается в том, что если вы разветвляете РЕПО с несколькими пакетами, вам нужно будет переименовать все соответствующие пути импорта. Это в значительной степени хорошо, так как вы разветвили все эти пакеты, и пути импорта должны отражать это.
вот способ, который работает для всех:
используйте github, чтобы раскошелиться на мой / РЕПО
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>>("мой/РЕПО" является заполнителем)
почему? Это позволяет вам иметь свое РЕПО, с которым работает любой "go get". Он также позволяет поддерживать и улучшать ветвь, которая хороша для запроса слияния. Он не раздувает git с "поставщиком", он сохраняет историю, и инструменты сборки могут иметь смысл.
чтобы автоматизировать этот процесс, я написал небольшой скрипт. Вы можете найти более подробную информацию о моем блог чтобы добавить команду, как "gofork" к вашей Баш.
function gofork() { if [ $# -ne 2 ] || [ -z "" ] || [ -z "" ]; 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 and replace in GOPATH: $GOPATH" go get go get currentDir=$PWD cd $GOPATH/src/ remote1=$(git config --get remote.origin.url) cd $GOPATH/src/ remote2=$(git config --get remote.origin.url) cd $currentDir rm -rf $GOPATH/src/ mv $GOPATH/src/ $GOPATH/src/ cd $GOPATH/src/ git remote add their $remote2 echo Now in $GOPATH/src/ origin remote is $remote1 echo And in $GOPATH/src/ their remote is $remote2 cd $currentDir } export -f gofork
используйте вендоринг и подмодули вместе
- вилка lib на github (go-mssqldb в этом случае)
- добавить подмодуль, который клонирует вилку, но имеет путь вверх по течению reop
например.
cd ~/go/src/github.com/myproj mygithubuser=timabell upstreamgithubuser=denisenkom librepo=go-mssqldb git submodule add "[email protected]:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"почему
скачать все проблемы, о которых я слышал и сталкивался, пытаясь понять это сам.
- внутренний пакет refs в lib теперь работает, потому что путь остается неизменным от upstream
- новая проверка вашего проекта работает, потому что система подмодулей получает его из вашей вилки в правой фиксации, но в пути к папке вверх по течению
- вам не нужно знать, чтобы вручную взломать пути или возиться с инструментами go.
Подробнее
Comments