[go] Go에서 분기 된 패키지 가져 오기 사용

에 저장소가 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

프로젝트에서 패키지를 사용하려면

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


답변

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-orggit 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