Git LFS - 两台不同机器上缺少不同文件的致命错误

时间:2017-04-07 12:54:11

标签: git repository bitbucket git-lfs bfg-repo-cleaner

我正在将我现有的存储库迁移到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的迁移。

**编辑**

我执行的步骤:

  1. 以旧格式(从转换前)到机器A的整个仓库的克隆。
  2. 我在机器A上运行BFG,它基本上重写了主分支的历史(没有其他分支远程保存)。
  3. 我运行git push origin master --force,因为您应该用新版本的master替换旧版本的master。
  4. 我在机器B上运行git fetch以获取所有文件。
  5. 在机器B上有一些提交,在主机中还没有被发送到服务器 - 因为它们会导致回购超过配额。因此,我运行git rebase --onto origin/master HEAD~3 HEAD将未发送的新提交移动到新版本的master。
  6. 我在机器B上运行git push origin master
  7. 这就是我现在所处的位置。

2 个答案:

答案 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。