127

にリポジトリが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
4

12 に答える 12

135

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"
于 2019-06-27T14:01:29.733 に答える
86

プルリクエストを処理するには

  • リポジトリ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

于 2015-03-20T07:59:00.060 に答える
20

これを解決する1つの方法は、IvanRaveとhttp://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.htmlによって提案されたフォークの方法です。

もう1つは、golangの動作を回避することです。するとgo getgolangはディレクトリをリポジトリ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 ./...

golangawesome-orgは、このリポジトリを続行することを完全に喜んでおり、git remoteがである間、一部の上位ディレクトリに名前が付いていることを実際には気にしませんawesome-you。のすべてのインポートawesome-orgは、ローカルワーキングセットである作成したディレクトリを介して再実行されます。

詳細については、私のブログ投稿を参照してください:GitHubでGolangリポジトリをフォークし、インポートパスを管理する

編集:固定ディレクトリパス

于 2015-11-24T13:59:51.740 に答える
5

フォークが一時的なものである場合(つまり、フォークをマージする予定の場合)は、その場で開発を行います$GOPATH/src/launchpad.net/goamz

次に、バージョン管理システムの機能(たとえばgit remote)を使用して、アップストリームリポジトリを元のリポジトリではなくリポジトリにします。

他の人がリポジトリを使用するのは難しくなりますgo getが、アップストリームに統合するのははるかに簡単になります。

実際、私はgoamzのリポジトリを持っておりlp:~nick-craig-wood/goamz/goamz、まさにその方法で開発しています。たぶん、作者はいつかそれをマージするでしょう!

于 2013-01-15T22:34:43.440 に答える
3

これがすべての人に役立つ方法です。

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機能するようになります。また、プルリクエストに適したブランチを維持および拡張することもできます。gitを「ベンダー」で膨らませることはなく、履歴を保持し、ビルドツールでそれを理解できます。

于 2017-08-24T03:33:20.237 に答える
2

これに対する答えは、複数のパッケージでリポジトリをフォークする場合、関連するすべてのインポートパスの名前を変更する必要があるということです。これらのパッケージをすべてフォークし、インポートパスにこれを反映する必要があるため、これはおおむね良いことです。

于 2013-01-14T21:34:13.127 に答える
1

特定の場所にクローンを作成する代わりに、必要な場所にクローンを作成できます。次に、次のようなコマンドを実行して、Goにローカルバージョンを参照させることができます。

go mod edit -replace github.com/owner/repo=../repo

https://golang.org/cmd/go#hdr-Module_maintenance

于 2020-11-21T20:49:12.507 に答える
0

ベンダーとサブモジュールを一緒に使用する

  1. github(この場合はgo-mssqldb)でlibをフォークします
  2. フォークをベンダーフォルダーに複製するが、アップストリームリポジトリのパスを持つサブモジュールを追加します
  3. ソースコードのステートメントを更新importして、ベンダーフォルダーを指すようにします(vendor/プレフィックスは含まれません)。例vendor/bob/lib=>import "bob/lib"

例えば

cd ~/go/src/github.com/myproj

mygithubuser=timabell
upstreamgithubuser=denisenkom
librepo=go-mssqldb

git submodule add "git@github.com:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"

なぜ

これは、私がこれを自分で理解しようとしているときに聞いて遭遇したすべての問題を解決します。

  • パスがアップストリームから変更されていないため、ライブラリ内の内部パッケージ参照が機能するようになりました
  • サブモジュールシステムは、正しいコミットで、ただしアップストリームフォルダーパスでフォークからプロジェクトを取得するため、プロジェクトのフレッシュチェックアウトが機能します。
  • パスを手動でハックしたり、goツールを使用したりする必要はありません。

より詳しい情報

于 2018-08-16T18:07:29.627 に答える
0

現代の答え(少なくとも1.15以上になります)。

go mod init github.com/theirs/repo

元のパッケージ名である明示的なinitargを作成します。リポジトリ名を含めない場合は、gopathにあるものと見なされます。しかし、goモジュールを使用すると、ディスク上のどこにあるか、またはgitが実際に依存関係をどこから取得するかは気になりません。

于 2021-06-17T23:46:04.990 に答える
-1

このプロセスを自動化するために、私は小さなスクリプトを作成しました。「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
于 2017-10-26T07:09:07.277 に答える
-1

コマンドgo get -fを使用して、フォークされたリポジトリを取得できます

于 2020-01-22T08:37:48.710 に答える
-2

Gopkg.tomlファイルにこれらのブロックを以下に追加します

[[constraint]]
  name = "github.com/globalsign/mgo"
  branch = "master"
  source = "github.com/myfork/project2"

したがってproject2、代わりにフォークを使用しますgithub.com/globalsign/mgo

于 2019-08-21T09:54:06.243 に答える