首先,请告诉我是否应该重新措辞。我仍然在学习提问的最有效方法。
所以我的情况是我们有一个实验室设置,其中包含许多使用每台计算机的多个用户的计算机。用户不是开发人员,而是编辑他们需要推送的一些脚本。我已经创建了一些帮助脚本来指导他们创建分支和切换分支。但是,我真正喜欢的一个功能是,每当用户想要运行所述脚本时,都会进行检查以确保它们位于最新版本的分支上。这需要在后台运行,以便不要求他们输入用户名/通行证。
这是检查:
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一起使用
答案 0 :(得分:1)
"最佳"总是很棘手,但是因为你使用的是GitHub,所以这是一个非常方便的始终无密码的替代方案,至少在存储库是公开的时候。
要让Git在互联网电话上调用另一个(外国)Git,您可以使用ssh://url
或http://url
或https://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。
是,或与http
或git
一样的协议("方案"部分网址)。事实上,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
即可获取最新信息。