web-dev-qa-db-ja.com

スクリプトでgit cloneにユーザー名/パスワードを与えるが、資格情報を.git / configに保存しない方法

次のようなスクリプトでgitリポジトリのクローンを作成しています。

git clone https://user:[email protected]/name/.git

これは機能しますが、私のユーザー名とパスワードです!現在、Origin URLの.git/configに保存されています。

どうすればこれを防ぐことができますが、スクリプトでこれを行うことができますか?

36
Nathan

私が使用する方法は、実際にはクローンの代わりにgit pullを使用することです。スクリプトは次のようになります。

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:[email protected]/name/repo.git master

ユーザー名またはパスワードは.git/configに保存されません。ただし、他の手順を実行しない限り、現在のプロセスを表示するコマンド(psなど)からプロセスが実行されている間、プレーンテキストのユーザー名とパスワードは表示されます。

コメントで述べたように、このメソッドはHTTPSを使用しているので 特殊文字はURLエンコードする必要があります パスワードにも表示される可能性があります。

(sshを使用できない場合)私が行うもう1つの提案は、プレーンテキストのユーザー名/パスワードの代わりに実際にOAuthトークンを使用することです。プロファイル設定からOAuthトークンを生成できます: https://github.com/settings/tokens

次に、そのトークンを使用すると、pullコマンドは

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
23
FGreg

IMOの最適なソリューションは、カスタムGIT_ASKPASSヘルパーを使用し、パスワードを別の環境変数として提供することです。したがって、たとえば、ファイルgit-askpass-helper.shを次のように作成します。

#!/bin/sh
exec echo "$GIT_PASSWORD"

次に、環境変数git clone https://username@hostname/repoおよびGIT_ASKPASS=/path/to/git-askpass-helper.shを使用してGIT_PASSWORD=nuclearlaunchcodesを実行します。

これには、パスワードがプロセスリストにも表示されないという利点があります。

19
intgr

~/.netrcファイルに接続認証情報を入力できます。以下に沿ったもの:

machine Host.example.net
login bart
password eatmyshorts

そのファイルを600にchmodするようにしてください。Windowsを使用している場合は、次のリンクが役立つ場合があります。 https://stackoverflow.com/questions/6031214/git-how-to-use-netrc- file-on-windows-to-save-user-and-password

個人的には、認証のためにSSHキーを使用する傾向があります(もちろん、許可されている場合)。

14
Brett Levene

数十/SO投稿、ブログなど)を試した後、everyメソッドを試しましたが、これは何ですか思いついたすべてのものをカバーしています。

The Git Credentials&Private Packages Cheatsheet を参照してください

これらは、gitを安全に認証してリポジトリを複製するすべての方法とツールですインタラクティブなパスワードプロンプトなし

  • SSH公開鍵
    • SSH_ASKPASS
  • APIアクセストークン
    • GIT_ASKPASS
    • .gitconfigの代わりに
    • .gitconfig [資格情報]
    • .git-credentials
    • .netrc
  • ボーナス:プライベートパッケージで動作します
    • node/npm package.json
    • python/pip/eggs requirements.txt
    • Ruby gems Gemfile
    • golang go.mod

プレーンテキストストレージがない場合の最適なオプション

ここでの質問から、SSHキー、GIT_ASKPASS、またはgit credential storeのいずれかが、OSキーチェーンマネージャーを使用するのに最適です。

GIT_ASKPASSはおそらく3のうち最も理解されていないので、ここで詳しく説明します。その他はチートシートにあります。

GIT_ASKPASS

GIT_ASKPASSスクリプトの作成方法:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass

それの使い方:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://[email protected]/project.git

スクリプトは次の形式でstdinを受け取ります。

Password for 'scheme://Host.tld':

スクリプトは次のようなGit ENVを受け取ります。

GIT_DIR=/Users/me/project/.git
GIT_EXEC_PATH=/usr/local/Cellar/git/2.19.0_1/libexec/git-core
GIT_PREFIX=

詳細は チートシート をご覧ください。

5
CoolAJ86