2017-04-21 3 views
0

まず、言いたいことを言い換えるかどうか教えてください。私はまだ単語の質問に最も効果的な方法を学んでいます。どのように私はプログラムでgitフェッチを一度パスワードなしで、他の時間はパスワードで行うことができますか?

私の状況は、各コンピュータを使用する複数のユーザーがいる多数のコンピュータがあるラボ環境があるということです。ユーザーは開発者ではなく、プッシュする必要のあるスクリプトを編集します。私はブランチの作成とブランチの切り替えを通して、それらを導くいくつかのヘルパースクリプトを作成しました。しかし、私が本当に気に入っているのは、ユーザーが上記のスクリプトを実行したいときは常に、ブランチの最新バージョンを使用していることを確認するチェックがあります。これはバックグラウンドで実行する必要があり、ユーザー名/パスの入力を求められません。

これはチェックです:

git fetch --prune 
branchname=$(git rev-parse --abbrev-ref HEAD); 
changes=$(git log origin/$branchname ^HEAD); 
if [[ ! -z "$changes" ]]; then 
    echo "You may not have the latest version of the branch. Run git pull from ~/path/to/repo/ to bring in the latest changes" 
    echo "" 
fi 

問題は、我々はgitのフェッチを行う必要があると私たちは、ユーザがプッシュをしたときに、彼らは自分自身を使用しているように、HTTPSとしてURLを維持したいということですアカウント。

sshを使用する場合は、ユーザーがパスワードを要求してもユーザーがパスワードを要求しません。また、資格情報ヘルパーを使用する場合もパスワードは要求されません。また、パスワードをプレーンテキストで保存する必要もありません。

この質問を入力すると、フェッチするURLをsshを使用するように変更してhttpsを使用するように変更できることがわかりました。それが最善の解決策ですか?もしそうなら、ssh鍵を作成し、すべてのコンピュータにこれを実行する最良の方法を配備していますか?

私たちは、GitHubの

答えて

1

でこれを使用している「ベスト」は常にトリッキーですが、GitHubのを使用しているので、リポジトリが公開され、少なくともあれば、非常に便利常にパスワードフリーの代替があります。あなたはすでに知っているように、インターネット・携帯電話に別の(外国)のGitを呼び出すためにあなたのGitのために

、あなたは、ssh://urlまたはhttp://urlまたはhttps://urlを使用することができます。これらはそれぞれ異なるポートとプロトコルを使用します。 sshは、公開鍵と秘密鍵を使用するセキュアシェルを使用します。 httpは、セキュリティで保護されていない(SSL/TLSなし)Webブラウザスタイルのアクセスを使用します。 httpsは、セキュリティで保護された(SSL/TLS)ウェブブラウザスタイルのアクセスを使用します。最後のものにはパスワードが必要で、最初のものには鍵が必要です。中間のものは何も必要ありません。

これは1つの方法です。しかし、Gitにはさらに効率的なgitスキームがあります。git://urlhttp://urlと同じ意味ですが、Gitポートとプロトコルを使用します。これも認証されていないため、パスワードは必要ありません。公共アクセスが必要なのは、http://urlと同じです。 GitHubもこれをサポートしています。

リポジトリが公開されていない場合、格納されているsshキーが機能します。しかし、アクセスを許可するsshキーがあれば、それはおそらくプッシュにも十分です。なぜこれが最初の問題であるのかわかりません。

この質問を入力すると、フェッチのURLをsshを使用してhttpsを使用するように変更できることがわかりました。

はい、またはプロトコルなどのhttp又はgit(URLの「スキーム」部分)と同じ。実際、Gitは1つのリモート用に2つのURLをサポートしているので、リモートのフェッチURL(remote.origin.url)をパスワードなしのバージョンに、リモートのプッシュURL(remote.origin.pushurl)をパスワードベースのバージョンに設定するだけです。言っ

は、このスクリプトではマイナーな傷や2があります:HEADは「デタッチ」である

git fetch --prune 
branchname=$(git rev-parse --abbrev-ref HEAD); 

場合はbranchname=HEADを取得しますので、これはちょうど、HEADを印刷します。それは何をするおそらく良いでしょう:

branchname=$(git symbolic-ref -q --short HEAD) || die "not on a branch" 

dieはメッセージを出力して終了します場所)

changes=$(git log origin/$branchname ^HEAD); 

これは、現在のブランチのための上流は、同じ名前が付けられていることを前提としてい現在のブランチ。それは事実ではないかもしれませんし、実際には上流には存在しないかもしれません。まさに最後のケース(なし上流のセット)のために行うには、あなた次第ですが、テストすることができ:

​​

(これはGitの自体がfatal: no upstream configured for branch 'master'を印刷したり、現在あるものは何でも、分岐することができます)。

if [[ ! -z "$changes" ]]; then 
    echo "You may not have the latest ..." 
    echo "" 
fi 

あなただけの今、フェッチされた上流の「先の」現在のブランチ任意のリビジョンがあるかどうかをテストしようとしているので、あなたは完全なgit logを必要としません。

n=$(git rev-list --count [email protected]{upstream}) || exit 
if [ $n -gt 0 ]; then ...; fi 

git rev-list --countは自動的に失敗するようになりましたあなたも、支店名やその上流を見つける必要がありません:あなたはこれらのリビジョンをカウントすることができ

$ git checkout --detach HEAD 
HEAD is now at cf11a6797... Eleventh batch for 2.13 
$ git rev-list --count [email protected]{u} 
fatal: HEAD does not point to a branch 
$ git checkout diff-merge-base 
Switched to branch 'diff-merge-base' 
$ git rev-list --count [email protected]{u} 
fatal: no upstream configured for branch 'diff-merge-base' 
$ git checkout master 
Switched to branch 'master' 
Your branch is behind 'origin/master' by 137 commits, and can be fast-forwarded. 
    (use "git pull" to update your local branch) 
$ git rev-list --count [email protected]{u} 
137 

だから、我々は減らすことができますスクリプト全体へ:

n=$(git rev-list --count [email protected]{u}) || exit 
if [ $n -gt 0 ]; then 
    echo ... 
fi 

私はgit pullを推奨しません。 git fetchが取得されたので、最新の情報に更新するにはgit mergeを実行してください。

+0

うわー、これは非常に徹底して役立ちました。私はそれが実際にはどのアカウントがプルとプッシュを行うのかは問題ではないことに気がついたので、重要なことは誰がコミットするのでsshキーを使って行くつもりです。 私は間違いなくあなたの提案を実装するつもりです、ありがとう! –

関連する問題