我的主要开发项目有很多分支。
我在生产服务器上使用GIT克隆。我最近发现了--single-branch,它使用极少的空间来编写git文件。有没有什么方法可以将现有的git安装转换为更浅的版本(就好像我做了--single-branch)而无需重新初始化整个事物。
答案 0 :(得分:1)
我将假设单分支回购会更小。这符合我的经验,但考虑到包文件的处理,我无法100%确定这将永远有效。在最坏的情况下,我猜你可以在选项2结束时定期运行“清理程序”,以确保本地最小化。
那说......
如果您可以直接访问存储库(即可以作为本地存储库与其进行交互),那么您可以执行您所要求的操作。但在我看来,重新克隆更容易。我假设您不想重新克隆,因为您不希望从生产中删除工作副本 - 即使是暂时的。如果是这样的话,有办法解决它。但是,如果还有其他原因不能重新克隆,我也会说明另一种方法。
选项1 - 在保留工作树的同时重新克隆
基本上这里要做的只是创建一个新的单独克隆,然后将.git/
文件夹交换到旧的repo。我通常不建议手动弄乱.git/
文件夹;所以这是这种方法的缺点,我们需要小心。
cd /path/to/old/repo
mv .git ../backup.of.old.repo.git
cd ..
git clone --single-branch --branch master url/of/origin new.repo
mv new.repo/.git repo
然后检查git status
,执行其他任何有效的验证,确保在丢弃backup.of.old.repo.git
之前一切正常。
选项2 - 修改现有的回购配置
--single-branch
的主要功能是修改远程的获取规则。你可以轻松地做到这一点
git config remote.origin.fetch +refs/heads/master:refs/remotes/origin/master
但你的回购仍然拥有所有其他分支(因为它是如何创建的);它不会在将来寻找它们。清除现有对象是更难的部分。
清理程序:
首先,您需要摆脱所有不需要的参考。您可以通过强力执行此操作(从.git/packed-refs
删除条目,从.git/refs/
删除文件),但如果您这样做,请小心。或者您可以使用git branch --delete
,git tag --delete
等来验证所有内容都与git for-each-ref
类似。
但仅仅因为所有引用都消失了并不意味着没有任何东西可以达到不需要的提交。你还必须核对reflog。有git命令,但我从来没有太多运气让他们做我想做的事情。如果您知道其他任何内容都不需要本地reflog,您可以rm -r .git/logs
。
但是,因为没有任何东西可以达到不受欢迎的提交并不意味着它们已经消失了。现在您需要git gc --aggressive --prune=now
这应该最终减少回购的规模,假设那些其他分支占据了大部分空间......
答案 1 :(得分:-1)
当然,只需:
# configure to only fetch master branch
git config --replace-all remote.origin.fetch +refs/heads/master:refs/remotes/origin/master
# delete all remote tracking branches
git for-each-ref refs/remotes/origin --format='%(refname)' | xargs -l git update-ref -d
# reinstante the still fetched branch ref
git fetch origin
# repack the repository to throw out the dangling commits from the deleted branches
git repack -adl --depth=250 --window=250
这只会清理远程分支。
提取的标记不可识别,它们与本地创建的标记相同
如果您没有本地标签或不介意丢失或重新标记,可以替换
git for-each-ref refs/remotes/origin --format='%(refname)' | xargs -l git update-ref -d
通过
git for-each-ref refs/remotes/origin refs/tags --format='%(refname)' | xargs -l git update-ref -d
还删除了未指向仍然获取的分支的历史记录的标记。