如何在git checkout失败后恢复git lfs post-checkout钩子



我正在一个巨大的git单库中工作,大约有100 GB的大小。我们在.git/hooks/post-checkout中有一个git的签出后钩子,其中包含以下钩子,用于在每次签出后运行git lfs:

#!/bin/sh
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout.n"; exit 2; }
git lfs post-checkout "$@"

我刚刚运行了git checkout main,经过3小时的运行和27 GB的数据通过我的互联网连接下载,它失败了,因为我的磁盘已满,在大约97%完成通过git lfs后签出钩子操作。

所以,我清理了一些磁盘空间。

现在,git checkout main失败,错误:

错误:您对以下文件的本地更改将被签出覆盖:

因此,我尝试手动运行git lfs post-checkout main(我甚至不知道这是否是一个合理的命令—我在这里猜测),它也失败了,使用:

这应该通过Git的post-commit钩子运行。执行git lfs update命令安装

是否有任何方法可以恢复我的git lfs操作,这样我就不必清除刚刚下载的所有27 GB数据并从头开始重新下载(通过git reset --hard && git clean -fd && git checkout main)?

请注意,git checkout main已经显示了一些错误,这是git lfs签出后钩子操作的结果:

error: Your local changes to the following files would be overwritten by checkout:
[list of tons of files]
error: The following untracked working tree files would be overwritten by checkout:
[list of tons of files]
Aborting
0

我的一个想法是注释掉.git/hooks/post-checkout目录中的最后一行,使其看起来像这样:

# git lfs post-checkout "$@"

然后保存文件并运行git checkout main。完成后,运行git lfs pull,然后取消上面一行的注释,使该文件恢复正常。这样,由于git checkout单独需要大约10分钟,并检出大约80000个文件,至少,该部分将在git lfs部分运行之前完成并通过,并且需要永远(3个多小时),并且可能崩溃。

我不确定这是否有效,但无论如何,我没有一个确切的解决方案来解决我的问题,所以这就是我所做的:

  1. git checkout main失败,因为我的磁盘空间不足。git status现在显示了数千个被更改和未分级的文件。因此,运行以下命令清除git status,为再次运行git checkout做准备:
    git status        # see that there are thousands of unstaged changes
    git reset --hard  # reset changed files back to how they are in `main`
    git clean -fd     # delete all unstaged files and directories
    git status        # this should now be clean
    
  2. 如果使用bazel构建系统,通过删除bazel缓存来减少磁盘使用:
    df -h  # check current disk usage
    rm -rf ~/.cache/bazel  # delete Bazel build cache
    df -h  # ensure you have more space free now
    
  3. 减小.git文件夹的大小以释放磁盘空间。在这里查看我的完整答案:如何收缩.git文件夹。
    time git lfs prune
    time git gc
    time git prune
    time git repack -a -d --depth=250 --window=250
    
  4. 现在再试一次结帐,只是让它重新下载整个30gb左右的过程在3+小时。哦,好吧……至少现在它会通过,因为我刚刚释放了磁盘空间,1)减少我的.git目录的大小,2)删除我的Bazel构建缓存:
    time git checkout main    
    

相关内容

  • 没有找到相关文章

最新更新