Git结帐分支并修剪与先前结帐有关的所有内容(包括git-lfs仍然存在)

时间:2019-01-27 00:20:30

标签: git git-submodules git-checkout git-lfs

我有一个带有多个子模块的超级项目的仓库。 两者的很多文件都在Git LFS中。

回购包含多个长期存在的发行分支。

问题

完整的克隆将传输20 GB的Git和Git LFS对象。

master的结帐将总回购扩展到40 GB, 那就是对象和工作树文件在一起。

让我们将三个单独的克隆视为创建的规范方法 三个工作副本,每个长期存在的分支一个:

git clone --branch master      --recursive --jobs 8 https://repo repo_master
git clone --branch release/1.0 --recursive --jobs 8 https://repo repo_release1
git clone --branch release/2.0 --recursive --jobs 8 https://repo repo_release2

我正在尝试得出与上述类似的网络优化方案: -使用签出的默认主副本克隆一次 -复制克隆的存储库的多个副本 -结帐发布分支

问题

  1. 如何检出从远程获取的现有分支, 删除上一个分支并清理所有遗骸?

  2. 如何清理与先前签出的所有内容 主机及其工作树,是否有任何先前缓存的LFS下载等??

但是,为了保留原住民/主人的历史。

解决方案原型

这是我针对网络优化的工作流程提出的:

git clone --branch master --recursive --jobs 8 https://repo repo_master

cp -a repo_master repo_release1
cp -a repo_master repo_release2

cd repo_release1
git checkout -b release/1.0 --track origin/release/1.0

git pull
git submodule update --init --recursive --jobs 8

git branch -D master

git lfs prune
git submodule foreach --recursive git lfs prune

git lfs checkout
git submodule foreach --recursive git lfs checkout

原型问题

看起来正确还是缺少/多余的步骤?

在任何时候运行其中任何一个是否有意义?

git gc --aggressive --prune=now
git submodule foreach --recursive git gc --aggressive --prune=now

请假设,在 git clone --branch master ...cp -a repo_master ...

该问题也已发布到Git mailing listGit LFS at GitHub

2 个答案:

答案 0 :(得分:2)

到目前为止,在Git邮件列表(问题链接)中或此处都没有找到满意的答案。收到的唯一答案是来自GitHub上Git LFS项目的given by Brian。我正在下面复制它。

  

我认为这种方法看起来不错。   我认为没有必要在此处运行git gc,   而且无论如何也不会产生任何影响。

感谢Brian确认我的工作流程。

免责声明:我建议Brian在这里发布答案,但他似乎并没有使用SO。我觉得接受我自己对Brian的回答的正确做法是不正确的,所以我将其作为一个无法接受的答案(希望主持人同意)。

答案 1 :(得分:0)

我对LFS不太了解,所以如果我的答案不正确,请原谅我。

我认为git worktree可能是解决方案,因为它允许您为多个工作树提供一个(本地)存储库,因此,签出多个分支而无需复制存储库本身。