我正在将我现有的存储库迁移到git lfs,似乎我设法创建了一个完美的风暴。
目前有两台机器:A和B.
机器A缺少文件X的内容。调用git lfs fetch --all origin
时出错。机器B缺少文件Y的内容。
我尝试在两者上调用git lfs push --all origin
。它不能在机器A上工作,因为它没有文件X.它不能在机器B上工作,因为它没有文件Y.
我怎样才能解决这种情况。我不知道这是怎么发生的,甚至可能发生的。
在其中一台机器上输出git lfs push
:
Git LFS: (0 of 982 files, 1300 skipped) 0 B / 1.73 GB, 1.09 GB skipped
d8d0edd8e03f523ab08de27e72a17272ddd24170764e0a9f836c8ba95cf73006 does not
exist in .git/lfs/objects. Tried
Assets/weapons/models/at_mine/textures/1k/at_mine__normal_1k.bmp, which
matches d8d0edd8e03f523ab08de27e72a17272ddd24170764e0a9f836c8ba95cf73006.
在其中一台机器上输出git lfs fetch
:
git lfs fetch --all
Scanning for all objects ever referenced...
* 2319 objects found
Fetching objects...
Git LFS: (207 of 207 files, 722 skipped) 524.01 MB / 524.51 MB, 870.82 MB
skipped
[d8d0edd8e03f523ab08de27e72a17272ddd24170764e0a9f836c8ba95cf73006] Object
does not exist on the server: [404] Object does not exist on the server
[df1dbb12f35f5392c157beebbc3613f70993c691a68f4cc65033ade528de3418] Object
does not exist on the server: [404] Object does not exist on the server
[edaf4f6721fb14ce4d38d3adddc86aaaf6fbf0c7db11da451022a4f74af97f30] Object does not exist on the server: [404] Object does not exist on the server
... and so on and so on
我正在使用bfg repo cleaner执行向LFS的迁移。
**编辑**
我执行的步骤:
git push origin master --force
,因为您应该用新版本的master替换旧版本的master。git fetch
以获取所有文件。git rebase --onto origin/master HEAD~3 HEAD
将未发送的新提交移动到新版本的master。git push origin master
。这就是我现在所处的位置。
答案 0 :(得分:0)
因此,这可能与LFS对象的状态无关,但可能会导致清理尝试出现问题。您为机器B显示的rebase命令会使您处于某种尴尬状态。如果您最初有
A --- B --- C --- D <--(master)
然后你获取了重写的结果,给出了
A --- B --- C --- D <--(master)
A' --- B' <--(origin/master)
你指定的rebase命令,因为它列出了HEAD
作为ref ref的ref,会让你处于一个独立的头状态
A --- B --- C --- D <--(master)
A' --- B' <--(origin/master)
\
C' --- D' <--(HEAD)
所以无论LFS出现什么问题,推送master
都会失败。如果您想跟踪某些类型的清理后验证D
,可以标记它;然后HEAD
仍在D'
运行
git branch -f master
获取
A --- B --- C --- D <--[old-master])
A' --- B' <--(origin/master)
\
C' --- D' <--(master)
但就像我说的,如果每台机器都缺少一些LFS对象,那么这将无法解决这个问题。现在我假设两台机器都配置了git-lfs
。如果lfs install
在需要的时候没有被运行,我会看到相当奇怪的行为;但除非你做了一些模糊不清的事情,否则不太可能导致你在哪里......所以......
因为使用SHA-256识别LFS对象,所以具有匹配id的两个文件是相同的文件是一个非常安全的假设。因此,您可以尝试的一件事是在机器A上的.git/lfs/objects
下找到机器B中缺少的文件,并手动复制它。 (反之亦然。)如果在两者之间有一套完整的LFS对象,则可以通过这种方式修复情况。
要查找ID为d8d0edd8e03f523ab08de27e72a17272ddd24170764e0a9f836c8ba95cf73006的对象,您可以查看.git/lfs/objects/d8/d0/d8d0edd8e03f523ab08de27e72a17272ddd24170764e0a9f836c8ba95cf73006
如果两台计算机上都缺少某个对象,那么您可以尝试从原始存储库中找出相应的文件,并手动将其添加到其中一个本地LFS缓存中。
git lfs clean <original.file
答案 1 :(得分:0)
所以,显然整个问题源于我使用BFG转换我的存储库这一事实。不要做。据我所知,它可能会破坏您的存储库,就像砖矿一样。使用git-lfs-migrate。
我最初使用BFG是因为它更容易理解如何使用它。但是,如果您碰巧触摸或分支除最新提交之外的任何内容中的任何内容,则会导致不会在重写的提交中放置.gitattributes会产生各种问题。您还必须格外小心手动更改.gitattributes以匹配BFG命令。
基本上不要使用BFG,没有理由这样做。
首先:在尝试重写历史记录之前进行备份。并确保你这样做是正确的,因为Bitbucket.org和一些类似网站中的forks无法正确处理LFS。