에 저장소가 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
답변
pull 요청을 처리하려면
- 저장소
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
프로젝트에서 패키지를 사용하려면
답변
go 모듈을 사용하는 경우 . replace
지시문을 사용할 수 있습니다.
이
replace
지시문을 사용하면 VCS (GitHub 또는 다른 곳)에있는 다른 모듈이거나 상대 또는 절대 파일 경로가있는 로컬 파일 시스템에있는 다른 가져 오기 경로를 제공 할 수 있습니다.replace
지시문 의 새 가져 오기 경로 는 실제 소스 코드에서 가져 오기 경로를 업데이트 할 필요없이 사용됩니다.
따라서 go.mod 파일에서 아래를 수행 할 수 있습니다.
module github.com/yogeshlonkar/openapi-to-postman
go 1.12
require (
github.com/someone/repo v1.20.0
)
replace github.com/someone/repo => github.com/you/repo v3.2.1
v3.2.1
저장소의 태그는 어디에 있습니까 ? CLI를 통해 수행 할 수도 있습니다.
go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1"
답변
이를 해결하는 한 가지 방법은 Ivan Rave와 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 git@github.com:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git
cd tool/
go get ./...
golang 은이 리포지토리를 계속 사용하게되어 기쁩니다. 실제로 awesome-org
git remote가 awesome-you
. 에 대한 모든 가져 오기 awesome-org
는 방금 만든 디렉터리 인 로컬 작업 집합을 통해 다시 요청됩니다.
자세한 내용은 내 블로그 게시물 : GitHub에서 Golang 리포지토리 포크 및 가져 오기 경로 관리 를 참조하세요.
편집 : 고정 디렉토리 경로
답변
포크가 일시적인 경우 (예 : 병합하려는 경우) 현장에서 개발을 수행하십시오 (예 : $GOPATH/src/launchpad.net/goamz
.
그런 다음 버전 제어 시스템의 기능 (예 🙂 git remote
을 사용하여 업스트림 저장소를 원래 저장소가 아닌 저장소로 만듭니다.
다른 사람들이 저장소를 사용하기 어렵게 go get
하지만 업스트림에 통합하기가 훨씬 쉽습니다.
사실 저는 lp:~nick-craig-wood/goamz/goamz
정확히 그런 방식으로 개발하는 goamz 저장소를 가지고 있습니다 . 아마도 저자는 언젠가 그것을 병합 할 것입니다!
답변
모든 사람에게 적합한 방법은 다음과 같습니다.
github를 사용하여 “my / repo”로 포크합니다 (예제) :
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>>
git checkout master
왜? 이를 통해 모든 것이 go get
작동하는 저장소를 가질 수 있습니다 . 또한 풀 리퀘스트에 좋은 브랜치를 유지하고 향상시킬 수 있습니다. “공급 업체”로 부 풀리지 않고 기록을 보존하며 빌드 도구가이를 이해할 수 있습니다.
답변
이에 대한 대답은 여러 패키지가있는 저장소를 포크하는 경우 모든 관련 가져 오기 경로의 이름을 바꿔야한다는 것입니다. 이러한 패키지를 모두 포크하고 가져 오기 경로에이를 반영해야하므로 이는 대체로 좋은 것입니다.
답변
이 프로세스를 자동화하기 위해 작은 스크립트를 작성했습니다. 내 블로그 에서 “gofork”와 같은 명령을 bash에 추가하는 자세한 내용을 찾을 수 있습니다 .
function gofork() {
if [ $# -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; 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 $1 and replace $2 in GOPATH: $GOPATH"
go get $1
go get $2
currentDir=$PWD
cd $GOPATH/src/$1
remote1=$(git config --get remote.origin.url)
cd $GOPATH/src/$2
remote2=$(git config --get remote.origin.url)
cd $currentDir
rm -rf $GOPATH/src/$2
mv $GOPATH/src/$1 $GOPATH/src/$2
cd $GOPATH/src/$2
git remote add their $remote2
echo Now in $GOPATH/src/$2 origin remote is $remote1
echo And in $GOPATH/src/$2 their remote is $remote2
cd $currentDir
}
export -f gofork