0

我已经在多用户机器上建立了一个启用 LFS 的存储库,这样从事项目的其他人可以共享超过我们私有 GitLab 实例配额的大型专有文件。为避免冲突,我们让一个人(我)将主副本保存在他们的主目录中,并定期使用git fetchgit merge合并他们本地克隆的更改。

本地克隆都按预期工作。它们是用 创建的git clone /home/[MY USERNAME]/[REPO],并且更改在本地提交而不会出现问题。

但是,当我尝试合并他们的更改时,出现以下错误。

$ git fetch [OTHER USERNAME] # the remotes are named after each user
# no problems

$ git merge [COMMIT]
Downloading [FILENAME] (96 MB)
Error downloading object: [FILENAME]: Smudge error: Error downloading [FILENAME] ([HASH]): batch request: missing protocol: ""
Errors logged to /home/[MY USERNAME]/[REPO]/.git/lfs/logs/[TIMESTAMP].log
Use `git lfs logs last` to view the log.
error: external filter 'git-lfs filter-process' failed
fatal: [FILENAME]: smudge filter lfs failed

有趣的是,在收到错误后,我尝试合并的提交中存在所有非 LFS 跟踪文件的未跟踪副本。

日志文件不包含太多额外信息,除了以下环境信息:

LocalWorkingDir=/home/[MY USERNAME]/[REPO]
LocalGitDir=/home/[MY USERNAME]/[REPO]/.git
LocalGitStorageDir=/home/[MY USERNAME]/[REPO]/.git
LocalMediaDir=/home/[MY USERNAME]/[REPO]/.git/lfs/objects
LocalReferenceDirs=
TempDir=/home/[MY USERNAME]/[REPO]/.git/lfs/tmp
ConcurrentTransfers=8
TusTransfers=false
BasicTransfersOnly=false
SkipDownloadErrors=false
FetchRecentAlways=false
FetchRecentRefsDays=7
FetchRecentCommitsDays=0
FetchRecentRefsIncludeRemotes=true
PruneOffsetDays=3
PruneVerifyRemoteAlways=false
PruneRemoteName=origin
LfsStorageDir=/home/[MY USERNAME]/[REPO]/.git/lfs
AccessDownload=none
AccessUpload=none
DownloadTransfers=basic,lfs-standalone-file
UploadTransfers=basic,lfs-standalone-file
GIT_REFLOG_ACTION=merge aa5f82f
GIT_PREFIX=
GIT_EXEC_PATH=/usr/libexec/git-core

这是输出git config -l

filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
[MY USERNAME]=[MY NAME]
user.name=[MY NAME]
user.email=[MY EMAIL]
init.defaultbranch=main
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.[OTHER USERNAME].url=/home/[OTHER USERNAME]/[REPO]
remote.[OTHER USERNAME].fetch=+refs/heads/*:refs/remotes/[OTHER USERNAME]/*

我是否错误地配置了 git-lfs?有没有替代方法可以避免这个问题?我们确实需要本地托管的所有内容,因为这些文件是专有的。

4

1 回答 1

1

Git LFS 旨在与单个主遥控器一起工作,该遥控器通常命名为origin. 因此,当您调用 时git merge,Git LFS 将查看该远程对象并尝试下载它们。

但是,在您的情况下,您有多个遥控器,因此您需要git lfs fetch REMOTE BRANCH在合并之前使用。请注意,您还应该在执行合并后运行git lfs fetch --all REMOTE,因为您需要确保从该特定分支的历史记录中下载了所有对象;否则,如果该人删除他们的遥控器,您最终可能会在历史记录中丢失对象。

正如您可能已经猜到的那样,这不是 Git LFS 的预期工作流程,但它仍然是可能的。

于 2021-09-13T21:08:23.800 回答