我已经从
https://github.com/bk2204/scutiger编译了
git-lsf-transfer
,这样我就可以通过 ssh 而不是 https 为 lsf 传输大文件。
它有效。但是,它仅在存储库实际由调用 git 命令(从而执行 ssh)的用户拥有时才有效。当我将存储库的所有权更改为组/用户
git
(我的用户所属的)时,lsf 传输失败,并显示用户不是存储库所有者的消息。
如何配置 git-lsf-transfer 使其了解我是拥有该存储库的组的成员?
执行
git push
时,我收到以下消息:
batch request: bash: line 1: git-lfs-authenticate: command not found: exit status 127
error: failed to push some refs to '{host ip}:/mnt/data/git-repos/tst.git'
经过研究,我了解到 git-lfs-authenticate 被调用是因为 git-lfs-transfer 失败。
然后执行 git Push 并跟踪详细信息 (
GIT_TRACE_PACKET=true GIT_SSH_VARIANT=simple GIT_TRACE=1 GIT_TRANSFER_TRACE=1 GIT_CURL_VERBOSE=1 git push
)
...
11:53:55.020553 trace git-lfs: exec: git 'config' '--includes' '-l' '--blob' 'HEAD:.lfsconfig'
11:53:55.025721 trace git-lfs: attempting pure SSH protocol connection
11:53:55.025742 trace git-lfs: spawning pure SSH connection
11:53:55.025806 trace git-lfs: run_command: ssh {host ip} git-lfs-transfer /mnt/data/git-repos/tst.git upload
11:53:55.026081 trace git-lfs: exec: ssh '{host ip}' 'git-lfs-transfer /mnt/data/git-repos/tst.git upload'
11:53:57.797163 trace git-lfs: pure SSH connection successful
11:53:57.797176 trace git-lfs: pure SSH protocol connection failed: Unable to negotiate version with remote side (unable to read capabilities): EOF
11:53:57.797986 trace git-lfs: pre-push: refs/heads/master c038a0e6a57beae72c25efeccfe5cf0f516ad330 refs/heads/master e28e585285e828041442ac2e4b24b38340d3aa60
11:53:57.798080 trace git-lfs: exec: git '-c' 'filter.lfs.smudge=' '-c' 'filter.lfs.clean=' '-c' 'filter.lfs.process=' '-c' 'filter.lfs.required=false' 'show-ref'
...
从这个跟踪中,我得到了用于调用 git-lfs-transfer 的 ssh 命令。
随后我使用以下命令重现了该错误(基于跟踪):
ssh {host ip} git-lfs-transfer /mnt/data/git-repos/tst.git upload
导致出现以下错误:
repository path '/mnt/data/git-repos/tst.git/' is not owned by current user; class=Config (7); code=Owner (-36)
因此,当存储库的所有者是
git:git
时,就会发生这种情况。当我将其更改为 dstibbe:dstibbe
(我的帐户)时,它就可以工作了。 dstibbe
是git
小组的成员。
原因是因为 Scutiger 与 Git LFS 本地存储库适配器一样,需要查找
.git
目录的位置,对于 Scutiger 来说,还需要查找配置。如果没有合适的配置选项,Git 和 libgit2 都不会在另一个用户拥有的存储库上运行,而 Scutiger 使用的 libgit2 无法覆盖此功能。
理论上,Git 本身可以配置为允许这两项功能,并且我有一个分支切换到使用 Git。然而,虽然我作为一名 Git 开发人员知道这两项功能目前是安全的,但不能保证它们将来仍然如此。因此,如果我们启用此功能,Git 的未来版本可能会发生变化,然后我们就会遇到安全漏洞。
我已经在 Git 列表上开启了讨论,看看是否就改善这种情况达成了一致。通过与人们交谈,我得到的印象是,这可能很有价值,但做起来并不一定非常简单,因此有必要进行一些讨论。