2017-05-30 194 views
0

我的主要开发中有很多分支。GIT - 使克隆变浅

我在生产服务器上使用GIT克隆。我最近发现了--single-branch,它使用了很少的空间来编写git文件。有没有什么办法可以将现有的git安装转换为更浅的版本(就像我做了 - 单分支),而无需重新初始化整个事物。

回答

1

我会假设单分支回购会更小。这与我的经验相符,但考虑到包文件的处理,我不能100%肯定地说,这将始终有效。在最坏的情况下,我想你可以定期在选项2结束时运行“清理程序”,以确保本地最小化。

也就是说......

如果你有一个回购直接进行访问(即可以与它互动,本地存储库),那么你可以做你问什么。但在我看来,重新克隆更容易。我假设你不想重新克隆,因为你不想从生产中删除工作副本 - 即使是暂时的。如果是这样的话,有一种方法可以解决它。但为了万一有其他原因不能重新克隆,我还会阐述另一种方法。

选项1 - 再克隆,同时保持工作树

基本上在这里做什么只是创建一个新的,独立的克隆,然后交换.git/文件夹上的老回购。我通常不建议手动修改.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 --deletegit tag --delete等验证所有消失与git for-each-ref之类的东西。

但仅仅因为所有的裁判都没有了,并不意味着什么都不能达成不需要的提交。你也必须加注reflog。有这个git命令,但我从来没有很多运气让他们做我想做的。如果你知道本地reflogs不需要其他任何东西,你可以rm -r .git/logs

但仅仅因为没有任何东西可以达到不需要的提交并不意味着它们已经消失。现在你需要git gc --aggressive --prune=now

而这应该最终减少回购的规模,假设那些其他分支占了很大的空间...

-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 

也得到了删除标记,不点到仍然提取的分支的历史。