プライベートリポジトリを「取得」する適切な方法は何ですか?


143

私は$ go get多くのグーグルの試みの後、プライベートリポジトリで作業する方法を探しています。

最初の試み:

$ go get -v gitlab.com/secmask/awserver-go
Fetching https://gitlab.com/secmask/awserver-go?go-get=1
https fetch failed.
Fetching http://gitlab.com/secmask/awserver-go?go-get=1
Parsing meta tags from http://gitlab.com/secmask/awserver-go?go-get=1 (status code 200)
import "gitlab.com/secmask/awserver-go": parse http://gitlab.com/secmask/awserver-go?go-get=1: no go-import meta tags
package gitlab.com/secmask/awserver-go: unrecognized import path "gitlab.com/secmask/awserver-go

はい、ログイン情報を提供する方法がわからなかったため、メタタグは表示されませんでした。

2回目の試行:

https://gist.github.com/shurcooL/6927554をフォローしてください。.gitconfigに設定を追加します。

[url "ssh://git@gitlab.com/"]
    insteadOf = https://gitlab.com/
$ go get -v gitlab.com/secmask/awserver-go --> not work
$ go get -v gitlab.com/secmask/awserver-go.git --> work but I got src/gitlab.com/secmask/awserer-go.git

はい、動作しますが.git、プロジェクト名に拡張子を付けて、名前を元の名前に変更できますが、毎回$ go getうまくいくとは限りません。別の方法はありますか?


2
以下の回答に従って、エクスポートGOPRIVATEも必ず行ってください。例export GOPRIVATE="github.com/steelx/that-private-repo"
STEEL

回答:


91

設定することが1つあります。この例はGitHubに基づいていますが、これによってプロセスが変わることはありません。

$ git config --global url.git@github.com:.insteadOf https://github.com/
$ cat ~/.gitconfig
[url "git@github.com:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo

すでにそれを実行しましたが、実際には1つの構成のみです。catコマンドは確認のためだけです。
secmask 2014

1
これの唯一の欠点は、毎回グローバルgit構成を変更せずに、ホストごとに異なる構成を使用できないことです(たとえば、複数のプロバイダーを使用している場合)。彼女に説明するように、それは«のssh-レベル»でこれを指定するには、はるかに良いです:stackoverflow.com/questions/27500861/...
ヨアヒム・

1
これがもっと高く投票されたことを願っています。公開リポジトリの場合でも、2つの要素がパスワード認証を扱いにくくするため、私は可能な限りsshを使用することを好みます。これにより、すべてのgithubリポジトリがsshのURLに修正されます。ありがとう!
captncraig 2017年

53

適切な方法は、リポジトリを適切な場所に手動で配置することです。リポジトリが作成されたら、を使用go get -uしてパッケージを更新し、go installインストールできます。というパッケージ

github.com/secmask/awserver-go

に行く

$GOPATH/src/github.com/secmask/awserver-go

入力するコマンドは次のとおりです。

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git

5
@secmask go getは、一般的なケースのツールとして設計されています。Goチームは、構成可能性を追加しないことを明確に決定し、人々が自分の残骸を展開するのではなく標準に準拠するようにしました。これは、あなたが持っているケース(つまり、プライベートリポジトリ)のために作られたものではありません。
FUZ

@Shudipta編集を中止してください。質問はあなたが望む方法で悪く見えます。
fuz 2018年

素晴らしいドキュメント。私を助けた。
アニッシュバル

34

私の会社のgitlabでgo getプライベートリポジトリを使用する際に問題が発生しました。解決策を見つけるのに数分もかかりました。そして私はこれを見つけました:

  1. https://gitlab.mycompany.com/profile/accountでプライベートトークンを取得する必要があり
    ます。

  2. プライベートトークンで追加のヘッダーを追加するようにgitを構成します。

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. リクエストをhttpからsshに変換するようにgitを設定します

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. 最後に、go get通常どおり使用できます。

    $ go get gitlab.com/company/private_repo

3
の興味深い使い方http.extraheader。+1
VonC 2017

29
--globalにもたくさんのレポを使用した場合の他のgitサーバーにプライベートトークンを送りますか?安全なリスクはありますか?
secmask 2017

誰かレビューがありますか?私たちはそれらに
取り掛かった

13

上記のすべてが私にはうまくいきませんでした。リポジトリのクローンは正しく機能していましたが、それでもunrecognized importエラーが発生しました。

Go v1.13を表すので、ドキュメントでGOPRIVATE環境変数を次のように使用する必要があることがわかりました。

$ GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME

10

SSHを使用してgitをすでに取得している場合、Ammar Bandukwalaによるこの回答は簡単な回避策です。


$ go getgit内部的に使用します。次の1つのライナーは、SSH経由でパッケージを作成しgit、その結果、$ go getクローンを作成します。

Github:

$ git config --global url."git@github.com:".insteadOf "https://github.com/"

BitBucket:

$ git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"

10

以下のようになっていることをGitLab問題5769

GitLabでは、リポジトリは常にで終わるので、リポジトリ名を末尾に.git指定.gitして機能させる必要があります。次に例を示します。

import "example.org/myuser/mygorepo.git"

そして:

$ go get example.org/myuser/mygorepo.git

GitHubがを追加することでこれを解決するよう".git"です。

これは、「Goのリポジトリー取得のサポートの追加」で解決されることになっています#5958」(適切なメタタグが配置されている場合)
Go自体にはまだ問題がありますが、「cmd/go:go getはHTML5ドキュメントのメタタグを検出できません」です。


実際、それら(および他の人)はすでにメタタグをサポートしていますが、パブリックレポ(go getログインせずにメタタグを表示できる場所)でのみ機能します
secmask

@secmaskこれが、sshを使用している理由です。
VonC、2014

ああ、ちょうどそのオプション、私はhttp、https toを使用できますが、go getコマンドはgo get gitlab.com/secmask/awserver-go.git.git(http基本認証を要求します)のように見えますが、あまりよくありません。
secmask 2014

8

ここで github oauthトークンを生成し、github トークンを環境変数としてエクスポートします。

export GITHUB_TOKEN=123

基本認証URLを使用するようにgit configを設定します。

git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"

これでgo getプライベートリポジトリを作成できます。


5

ユーザー固有のssh-configを作成したので、ユーザーは正しい資格情報とキーで自動的にログインします。

まず、キーペアを生成する必要がありました

ssh-keygen -t rsa -b 4096 -C "my@email.here"

そしてそれをegに保存しました~/.ssh/id_my_domain。これは私がGithubアカウントに接続したキーペア(プライベートとパブリック)でもあることに注意してください~/.ssh/id_github_com

次に~/.ssh/config、エントリで呼び出されるファイルを作成(または変更)しました。

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_github_com

別のサーバーでは、「ssh-url」はadmin@domain.com:username/private-repo.git次のとおりであり、このサーバーのエントリは次のようになります。

Host domain.com
    HostName domain.com
    User admin
    IdentityFile ~/.ssh/id_domain_com

を明確にするためにUserHostHostNameが正しく設定されていることを確認する必要があります。

これで、goパスに移動してgo get <package>、たとえばgo get main、ファイルmain/main.goにパッケージが含まれている場所(上記の最後の例から)を参照できdomain.com:username/private-repo.gitます。


以下を使用してパッケージを直接インポートすることもできますgo get hostname.com/username/repo.git(.git拡張子は重要です)。
ヨアヒム・

拡張子なしでそれを行う方法はあります.gitか?なぜそれが起こるのですか?
Cristian Chaparro A.17年

1
興味深いことに、.git拡張機能がないとリポを取得できない理由は、ローカルのgit構成にあるgit config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/"ためですが、サブドメインにgitlab.myserver.comはssl証明書がないため、http代わりにを使用httpsします
クリスチャンチャパロA.17年

3

私は偶然出会い、.netrcそれがこれに関連していることに気づきました。

~/.netrc次の内容のファイルを作成します。

machine github.com
    login <github username>
    password <github password or Personal access tokens >

できた!

さらに、最新のGOバージョンでは、これを環境変数に追加する必要がある場合がありますGOPRIVATE=github.com (私はそれをmyに追加しました.zshrc

netrc また、HTTPSに対する個人のgithubアクセスが(私のSSH構成と同様に)マシン全体で使用されるように構成されているため、開発環境のセットアップも改善されます。

GitHubの個人用アクセストークンを生成する:https : //github.com/settings/tokens

SSH認証を使い続ける場合は、sshを強制的に使用する要求をマスクします

git config --global url."git@github.com:".insteadOf "https://github.com/"

gitアクセスを設定するその他の方法:https : //gist.github.com/technoweenie/1072829#gistcomment-2979908

特にWindows上のGitでの使用については、manページこの回答を参照してください


2

私にとって、他の人から提供された解決策は、まだ次のエラーを出しました go get

git@gl.nimi24.com:権限が拒否されました(公開鍵)。致命的:リモートリポジトリから読み取れませんでした。正しいアクセス権があり、リポジトリが存在することを確認してください。

このソリューションに必要なもの

  1. 他の人が述べたように:

    git config --global url."git@github.com:".insteadOf "https://github.com/"

  2. ./ssh/id_rsaリポジトリへの接続を認証するために使用されたキーからパスフレーズを削除します。これは、以下に対する応答としてプロンプトが出されたときに空のパスワードを入力することによって行うことができます。

    ssh-keygen -p

なぜこれが機能するのか

秘密鍵にパスフレーズを付ける方が常に良いので、これはかなりの回避策ではありませんが、OpenSSHのどこかに問題が発生していました。

go get内部でgitを使用し、opensshを使用して接続を開きます。OpenSSHは、認証に必要な証明書をから取得し.ssh/id_rsaます。コマンドラインからgitコマンドを実行するとき、エージェントはid_rsaファイルを開くように処理できるため、毎回パスフレーズを指定する必要はありませんが、go getの腹で実行すると、これはうまくいきませんでした場合。OpenSSHは次にパスワードの入力を求めますが、それが呼び出された方法が原因で不可能であるため、デバッグログに出力します。

read_passphrase:/ dev / ttyを開けません:そのようなデバイスまたはアドレスはありません

そして失敗するだけです。鍵ファイルからパスフレーズを削除すると、OpenSSHはそのプロンプトなしで鍵を取得し、機能します

これ、Goがモジュールを同時にフェッチし、同時にGithubへの複数のSSH接続を開くことが原因である可能性あります(この記事で説明しています)。これは、OpenSSHデバッグログがリポジトリへの最初の接続が成功したことを示したが、後でなんらかの理由で再試行し、今回はパスフレーズを要求することを選択したという事実によってある程度サポートされます。

ただし、前述の記事で提案されているように、SSH接続の多重化を使用するソリューションは、私にとってはうまくいきませんでした。記録として、著者は影響を受けるホストのssh設定ファイルに以下のconfを追加することを提案しました:

  ControlMaster auto
  ControlPersist 3600
  ControlPath ~/.ssh/%r@%h:%p

しかし、述べたように、私にとってはうまくいきませんでした

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.