使用git与gnome-keyring和http(s)仓库的正确方式是什么?

目前,每当我执行git pullgit push到一个http(s)仓库时,我会得到以下信息:
$ git pull
Username for 'https://gitrepos.reposdomain.com': me@mydomain.com
Password for 'https://me@mydomain.com@gitrepos.reposdomain.com': 

这对于偶尔使用来说还可以,但很快就会变得非常烦人。不幸的是,在这种情况下无法切换到ssh。 我读过早期版本的git提供了一个凭据“存储”和“缓存”,但不建议使用,因为它以明文形式存储密码。 但是 较新版本的git显然将git凭据存储在gnome-keyring中,但必须正确设置。
我尝试按照其他(非Ubuntu)SO答案的方法进行操作(特别是this one),但仍然出现用户名和密码提示。
正确且最安全的方式是如何存储http(s)仓库的git凭据,并如何在Ubuntu上使其工作?

1你应该提到你尝试过哪些方法,否则你可能会得到建议恰好是那些方法。 - muru
2一整个句子加粗和斜体几乎无法阅读。 - muru
上游Debian问题git-credential-libsecret软件包 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=878599 - Colonel Panic
4个回答

git-credential-gnome-keyring现已弃用。

相反,请使用libsecret。如果它尚未预先安装在您的计算机上,请按照以下步骤进行操作:

确保已安装`libsecret`及其开发库:
```shell sudo apt install libsecret-1-0 libsecret-1-dev ```
然后从随`libsecret`开发库一起提供的源代码构建凭据助手:
```shell sudo make --directory=/usr/share/doc/git/contrib/credential/libsecret ```
最后,将新编译的二进制文件注册为Git凭据助手
```shell git config --global credential.helper \ /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret ```
更多关于https://stackoverflow.com/a/40312117/2017781的详细信息。

2请注意,这个解决方案只适用于 git 版本 >= 2.11(在这个版本中可以找到 libsecret 目录)。 - Charles Roberto Canato
2这个安全吗?秘密存储在哪里?传输和存储都安全吗?有官方文档吗?根据这个页面这个页面,显然它在“Main”中,并由Debian/Ubuntu维护。并且:“它通过DBus与'Secret Service'通信。” - caw
1在GNOME中,“Secret Service”其实就是gnome-keyring-daemon,只是通过不同的API进行访问。(libsecret计划是允许其他桌面环境构建自己的后端以支持相同的API,比如KDE计划在kwalletd中实现此功能。) - user1686
5我更新了我的首选答案,因为我可以验证这在18.04版本上有效。 :) - tudor -Reinstate Monica-
3这似乎仍然是2020年2月的计划A。在Ubuntu 19.10上运行良好。 - ericP
1指示对我无效(非Ubuntu),但安装gnome-keyring(不是已弃用的libgnome-keyring)和libsecrets,然后遵循Arch的维基就可以了。 - user535764
1就我个人而言,这对我在全新安装的Ubuntu 20.04上有效,但只有在重启后才有效(也许与安装libsecret库有关?)。在重启之前,git clone或任何想要存储凭据的操作都会在libsecret存储操作中卡住。 - BeeOnRope
从共享文件系统上工作还安全吗?我想在我的大学电脑上设置这个,但我担心网络上的每个人都可以访问 /usr/share/doc/git/contrib/credential/libsecret/,这样其他用户就能够访问我的个人远程仓库了。 - Aerinmund Fagelson
1@AerinmundFagelson 这是密码管理器(libsecret)编译二进制文件存储的路径;libsecret绝对不会以明文形式将密码持久化在磁盘上! - eddygeek
感谢 @eddygeek 的澄清! - Aerinmund Fagelson
太棒了!刚在Ubuntu 20、git 2.25.1和Unity 7.5上进行了测试。完全不需要重启或其他操作...我必须补充说,这是一个全新的安装。 :) - Pandian Le
@eddygeek 我们如何将这个方法扩展到许多其他密码上? - Pandian Le
这里是一个处理多个账号和密码的答案。:) 上面的方法只适用于一个账号。 - Pandian Le
@PandianLe Git-Credential-Manager core的主要区别在于多因素身份验证。正如这里所指出的,将用户放入远程URL中就足以实现多账户功能。(这种技术适用于任何凭据助手) - eddygeek
嗨 @eddygeek,这个 是我的问题,VonC回答了。VonC建议我使用GCM。解决方案是在我使用gcm并更新git后,在远程URL中添加用户。我真的不确定如果没有这个步骤是否会起作用。你测试过吗? - Pandian Le
VonC说:“任何凭据助手都应该遵循相同的流程。” - “由于gcm核心安装起来有点麻烦,先用经典的基于libsecret的助手进行测试。” 但是,不,我个人没有测试过它。 - eddygeek
1Arrggghhhh sudo make. 不要在家里尝试这个。 - Paul Childs

您需要使用 Gnome Keyring 设置 git 凭据助手

安装并编译 Gnome Keyring 开发套件:

sudo apt-get install libgnome-keyring-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/gnome-keyring

设置凭据:
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring

这真的很奇怪。从语义上讲,链接中的答案和这个答案之间不应该有任何区别。但由于某种原因,这个答案有效而另一个却无效。 - tudor -Reinstate Monica-
然后像平常一样运行git push或者git pull,第一次运行时它会要求输入并存储密码,之后每次都会从密钥环获取。为了验证,运行seahorse,它应该在"密码" -> "登录"下列出。 - tudor -Reinstate Monica-
@tudor 这很奇怪,我没有看到我的回答和链接中有任何“概念上”的区别。很高兴能帮到你。 - user98829
对我来说似乎很奇怪,你仍然需要运行“make”命令,但这些步骤非常有效。谢谢! - DaveTheScientist
适用于Ubuntu 16.04等版本,但对于Ubuntu 20.04+,您可能希望使用libsecret - caw
又一个危险的sudo make建议。 - Paul Childs

这种简单的方法在我的Ubuntu 18.04.1上似乎足够,使用的是git 2.17.1版本。
git config --global credential.helper cache

你可以像这样指定一个一小时(=3600秒)的超时时间:
git config --global credential.helper 'cache --timeout=3600'

请参阅详细手册以获取更多信息。

1这很有帮助,手册还提供了如何保存到文件的链接。https://git-scm.com/book/en/v2/Git-Tools-Credential-Storage。然而,它实际上并没有使用gnome keyring。 - poleguy

尝试git-credential-oauth,可在Ubuntu lunar and later中使用。

不再需要密码! 不再需要个人访问令牌! 不再需要SSH密钥!

git-credential-oauth是一个Git凭据助手,可使用OAuth安全地身份验证到GitHub、GitLab、BitBucket和Gerrit。

第一次推送时,助手将打开浏览器窗口进行身份验证。存储生命周期内的后续推送不需要任何交互。

安装:

sudo apt-get install git-credential-oauth

配置:
git config --global --unset-all credential.helper
git config --global --add credential.helper "cache --timeout 7200" # two hours
git config --global --add credential.helper oauth

如果你已经安装了,你也可以使用git-credential-libsecret作为git-credential-cache的替代存储方式。