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

问题描述 投票:0回答:1

我的

git lfs checkout
由于磁盘空间不足,在 3 小时内下载 27 GB 时,完成度为 97%,但始终失败。有什么方法可以恢复它,而不是在释放一些磁盘空间后重新开始?


我正在一个巨大的

git
mono-repo 中工作,大小约为 100 GB。我们在
.git/hooks/post-checkout
中有一个 git post-checkout 钩子,其中包含以下钩子,用于在每次结账后运行
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 数据,但它失败了,因为我的磁盘已满,通过
git lfs
结帐后挂钩操作完成了大约 97%。

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

现在,

git checkout main
失败并出现错误:

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

所以,我尝试手动运行

git lfs post-checkout main
(我什至不知道这是否是一个合理的命令——我在这里猜测),它也失败了,并显示:

这应该通过 Git 的提交后挂钩运行。运行

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

2024 年 5 月 21 日更新:我的最终解决方案?

不要使用

git lfs
Git LFS 是邪恶的。 所以不要使用它。

git git-lfs
1个回答
0
投票

我的一个想法是注释掉

.git/hooks/post-checkout
目录中的最后一行,使其看起来像这样:

# git lfs post-checkout "$@"

然后,保存文件并运行

git checkout main
。完成后,运行
git lfs pull
,然后取消注释上面的行以使该文件恢复正常。这样,由于
git checkout
alone 需要大约 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. 现在再次尝试结帐,只需让它在 3 个多小时的时间内重新下载整个 30 GB 左右的内容。 :( 哦好吧...至少现在会过去了,因为我刚刚释放了磁盘空间 1) 减小了我的
    .git
    目录的大小和 2) 删除了我的 Bazel 构建缓存:
    time git checkout main    
    

完成。

© www.soinside.com 2019 - 2024. All rights reserved.