2017-04-21 17 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獲取,我們要保持URL爲HTTPS,這樣每當用戶做一推,他們正在用自己帳戶。

如果我們使用ssh,那麼就不會在用戶做它和同樣要求的用戶名/密碼,如果我們使用憑據幫手。我們也不想以純文本存儲密碼。

鍵入這個問題,我意識到,我可以改變的URL,獲取使用ssh和推動使用https。這是最好的解決方案嗎?如果是這樣,是創建一個ssh密鑰,並部署到所有的計算機的最佳方式來做到這一點?

,我們正在使用這種與Github上

回答

1

「最佳」始終是棘手的,但因爲使用的是GitHub上,有一個非常方便的自由永遠密碼替代,至少如果存儲庫是公共的。

爲了您的Git調用了另一個(國外)Git的互聯網電話,你可以,因爲你已經知道,使用ssh://urlhttp://urlhttps://url。這些都使用不同的端口和協議; ssh使用帶公鑰和私鑰的secure-shell; http使用不安全(無SSL/TLS)Web瀏覽器式訪問;和https使用安全(SSL/TLS)Web瀏覽器式訪問。最後一個需要密碼,第一個需要密鑰;但中間的一個根本不需要任何東西。

所以這是一個方法。但Git也有更高效的git方案:git://url的含義與http://url相同,但使用Git端口和協議。這也是未經過驗證的,所以它不需要密碼。它只需要公共訪問,就像http://url一樣。 GitHub也支持這一點。

如果存儲庫不公開,存儲SSH密鑰會工作。但是,如果有一個授予訪問權限的ssh密鑰,那可能也足以推送,所以我不知道爲什麼這首先是一個問題。

鍵入此問題我意識到我可以更改提取URL以使用ssh並推送使用https。

是,或者與httpgit一樣作爲協議(URL的「scheme」部分)。事實上,Git的支持用於遠程兩個獨立的網址,所以你可以設置遠程的獲取URL(remote.origin.url),以免密碼版,和遠程的推動URL(remote.origin.pushurl)的基於密碼的版本。

這就是說,有一個在這個腳本一個小小的瑕疵或兩個:

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

如果HEAD是「分離」,這將只是打印HEAD,所以你會得到branchname=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密鑰,因爲重要的是誰承諾。 我一定會實施你的建議,謝謝! –

相關問題