如何在没有密码的情况下以编程方式git获取一次,其他时候使用密码?

时间:2017-04-21 20:20:58

标签: git github ssh

首先,请告诉我是否应该重新措辞。我仍然在学习提问的最有效方法。

所以我的情况是我们有一个实验室设置,其中包含许多使用每台计算机的多个用户的计算机。用户不是开发人员,而是编辑他们需要推送的一些脚本。我已经创建了一些帮助脚本来指导他们创建分支和切换分支。但是,我真正喜欢的一个功能是,每当用户想要运行所述脚本时,都会进行检查以确保它们位于最新版本的分支上。这需要在后台运行,以便不要求他们输入用户名/通行证。

这是检查:

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 fetch,并且我们希望将url保持为HTTPS,以便每当用户执行推送时,他们都使用自己的帐户。

如果我们使用ssh,那么当用户执行时,它不会要求输入用户名/密码,如果我们使用凭证助手则不会。我们也不想以纯文本格式存储密码。

输入这个问题我意识到我可以更改fetch的url以使用ssh并推送使用https。这是最好的解决方案吗?如果是这样,是创建一个ssh密钥并部署到所有计算机的最佳方法吗?

我们正在与Github一起使用

1 个答案:

答案 0 :(得分: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密钥,那么推送也可能就足够了,所以我不确定为什么这首先是一个问题。

  

输入这个问题我意识到我可以更改获取的网址以使用ssh并推送使用https。

是,或与httpgit一样的协议("方案"部分网址)。事实上,Git为一个遥控器支持两个单独的URL,因此您只需将远程的提取URL(remote.origin.url)设置为无密码版本,以及远程的推送URL({ {1}})基于密码的版本。

那就是说,这个剧本中存在一两个小缺陷:

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本身可以打印git rev-parse --quiet --verify @{upstream} > /dev/null || exit 或者当前的任何分支。

fatal: no upstream configured for branch 'master'

因为您只是要测试是否有任何修订"在#34;之前它现在上游的当前分支,你不需要一个完整的if [[ ! -z "$changes" ]]; then echo "You may not have the latest ..." echo "" fi 。你可以算一下这些修订:

git log

现在您甚至不需要找到分支名称或其上游,因为n=$(git rev-list --count HEAD..@{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 HEAD..@{u}
fatal: HEAD does not point to a branch
$ git checkout diff-merge-base
Switched to branch 'diff-merge-base'
$ git rev-list --count HEAD..@{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 HEAD..@{u}
137

但我完全不会推荐n=$(git rev-list --count HEAD..@{u}) || exit if [ $n -gt 0 ]; then echo ... fi 。现在git pull已经提取,只需运行git fetch即可获取最新信息。