我最初的答案对我自己来说也不是很有用,所以我进一步研究了一下,发现了一个破解方法(尽管有点复杂)。
所以,我在MSYS2下使用git,我想使用凭据缓存,只是暂时记住我的密码(我还没有见过wincred或其他适用于windows的方法的用例)。
基本上,这需要一个https://github.com/git/git/blob/55144cc/builtin/credential-cache--daemon.c#L239的黑客-而不是死在这一行,我们想继续。
因此,首先,我们想在MSYS2下构建git。
问题1:你不能在MSYS2下构建合适的https://github.com/git/git,链接阶段将失败,“src/git/cache.h:1262: undefined reference to ' win32_has_dos_drive_prefix'”和类似的消息
因此,我们需要构建MSYS2中使用的实际git。首先,检查版本:
$ git --version
git version 2.33.0
$ pacman -Ss git | grep installed # msys/git 2.33.0-1 (VCS) [installed]
然后,根据https://www.msys2.org/wiki/Creating-Packages/,我们可以这样做:
$ git clone "https://github.com/msys2/MSYS2-packages"
$ cd MSYS2-packages/
$ cd git
$ makepkg -sCLf
==> Making package: git 2.33.0-1 (Thu, Sep 23, 2021 12:47:33 PM)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Installing missing dependencies...
...
make[1]: Entering directory '/c/src/MSYS2-packages/git/src/git-2.33.0'
make[1]: 'GIT-VERSION-FILE' is up to date.
make[1]: Leaving directory '/c/src/MSYS2-packages/git/src/git-2.33.0'
sed -e '1s|#!.*/sh|#!/bin/sh|' git-subtree.sh >git-subtree
chmod +x git-subtree
make: Leaving directory '/c/src/MSYS2-packages/git/src/git-2.33.0/contrib/subtree'
==> Starting check()...
注意:
这个构建过程首先在ASCIIDOC/XMLTO部分中结束,在我的机器上需要半个小时
然后它结束在一个*** prove ***部分,这需要更长的时间,但可以用Ctrl-C中断,并且构建的可执行文件将不会被擦除。
现在我们想在源代码中做一个hack;注意:
如果我们在源代码中进行黑客操作,我们不希望使用makepkg -sCLf,因为这将删除源目录(以及所有构建的.exe工件),然后在构建之前重构它
所以,我们用sed创建我们的hack,然后构建:
$ sed -i 's/die(_(permissions_advice), dir);/fprintf(stderr, "Permissions on cached credentials socket directory %s are too loose, but HACK: going on\\n", dir);/' ./src/git-2.33.0/builtin/credential-cache--daemon.c
$ (cd src/git-2.33.0/; make)
CC builtin/credential-cache--daemon.o
LINK git.exe
...
SUBDIR templates
在这一点上,请注意,黑客最终至少在三个可执行文件中结束,这可以通过以下方式确认:
$ grep -ao ....HACK........ ./src/git-2.33.0/git-credential-cache--daemon.exe
$ grep -ao ....HACK........ ./src/git-2.33.0/git-credential-cache.exe
$ grep -ao ....HACK........ ./src/git-2.33.0/git.exe
... 我只能把这三个都换掉后才能让它工作:
# backup the original files:
$ mv /usr/lib/git-core/git-credential-cache--daemon.exe /usr/lib/git-core/__git-credential-cache--daemon_orig.exe
$ mv -v /usr/lib/git-core/git-credential-cache.exe /usr/lib/git-core/__git-credential-cache__orig.exe
$ mv -v /usr/bin/git.exe /usr/bin/__git_orig.exe
$ mv -v /usr/lib/git-core/git.exe /usr/lib/git-core/__git_orig.exe
# copy over the hacked files:
cp -v ./src/git-2.33.0/git-credential-cache--daemon.exe /usr/lib/git-core/
cp -v ./src/git-2.33.0/git-credential-cache.exe /usr/lib/git-core/
cp -v ./src/git-2.33.0/git.exe /usr/bin/
cp -v ./src/git-2.33.0/git.exe /usr/lib/git-core/
在这一点上,凭据缓存也开始在MSYS2上为我工作(在有限的时间内缓存密码);它只是在启动时转储了被黑的行:
$ git pull
Password for 'https://user@git.mysite.com':
Permissions on cached credentials socket directory /home/user/.cache/git/credential are too loose, but HACK: going on
Already up to date.
# second pull, password is cached
$ git pull
Already up to date.
有点棘手,但似乎有用。
PS:一个棘手的事情是,我原本替换die只是一个打印到stdout,但这一直失败;事实证明,stdout是用于进程间通信的,为了使之成功,stdout上的答案显然是ok\0,也就是三个字节;因此,解决方案是将通知打印到stderr。
(原来的答案):
虽然没有完全回应这个问题,但这是我能找到的最合适的问题,作为回答:
我在Windows 10的MSYS2下使用git,目前有这样的版本:
$ git --version
git version 2.32.0
我通常只想让git缓存我的密码一段有限的时间(可能10分钟左右),然后忘记它;我还没有看到wincred或其他特定于windows的凭据管理器在这个用例中的使用。
话虽如此,对我来说,有一个“简单的解决方案”-基本上,第一次运行凭据管理器,它是好的;只有在以后的使用中,我才能得到:
$ git push
Password for 'http://user@githost.example.com':
fatal: The permissions on your socket directory are too loose; other
users may be able to read your cached credentials. Consider running:
chmod 0700 /home/user/.cache/git/credential
fatal: cache daemon did not start:
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
...
所以,基本上,解决方案是删除凭据目录-此后,凭据缓存管理器运行,就像第一次一样,并在有限的时间内缓存密码-正如我想要的那样:
$ rm -rf ~/.cache/git/credential
# note below, the very first pull still asks for a password:
$ git pull
Password for 'http://user@githost.example.com':
Already up to date.
# ... but the second pull does not, it uses credentials cache
$ git pull
Already up to date.
对我来说足够好了,我猜:)
编辑:不太好,我有过这样的经历,如果你尝试拉另一个标签,错误返回。