我有一个带有多个子模块的超级项目的仓库。 两者的很多文件都在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
我正在尝试得出与上述类似的网络优化方案: -使用签出的默认主副本克隆一次 -复制克隆的存储库的多个副本 -结帐发布分支
如何检出从远程获取的现有分支, 删除上一个分支并清理所有遗骸?
如何清理与先前签出的所有内容 主机及其工作树,是否有任何先前缓存的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 list和Git LFS at GitHub )
答案 0 :(得分:2)
到目前为止,在Git邮件列表(问题链接)中或此处都没有找到满意的答案。收到的唯一答案是来自GitHub上Git LFS项目的given by Brian。我正在下面复制它。
我认为这种方法看起来不错。 我认为没有必要在此处运行
git gc
, 而且无论如何也不会产生任何影响。
感谢Brian确认我的工作流程。
免责声明:我建议Brian在这里发布答案,但他似乎并没有使用SO。我觉得接受我自己对Brian的回答的正确做法是不正确的,所以我将其作为一个无法接受的答案(希望主持人同意)。
答案 1 :(得分:0)
我对LFS不太了解,所以如果我的答案不正确,请原谅我。
我认为git worktree
可能是解决方案,因为它允许您为多个工作树提供一个(本地)存储库,因此,签出多个分支而无需复制存储库本身。