[V 站有 git 大神吗? ]删除仓库的某个时间点之前的历史记录,减少.git 目录大小。 救命啊啊。

2016-08-08 09:48:05 +08:00
 Yancey
安卓仓库。有很多 commits 和分支。想删除某个时间点之前的所有 commits 减少.git 目录大小,找了很多办法。感觉只有 grafts+ filter-brnach 靠谱。不过还是遇到很多问题、
1.要截断的 commits 之前有很多分支。。用 filter-branch 不会删除这些分支,怎么解决?
2.这个仓库是公开仓库。很多人已经 clone 在本地。所以截断操作应该是在服务器还是本地?我试过在本地更改,但是推不到服务器上。如果在服务器操作,怎么将本地的改动变为最小?

示意图如下:
12411 次点击
所在节点    git
56 条回复
JhZ7z587cYROBgVQ
2016-08-08 09:55:00 +08:00
新开一个仓库?(手动滑稽)坐等楼下大神给出答案
Yancey
2016-08-08 09:56:25 +08:00
@jason0916 能新建...也不会这么麻烦了
vitovan
2016-08-08 09:56:31 +08:00
rebase ?
vitovan
2016-08-08 09:57:07 +08:00
https://git-scm.com/docs/git-rebase

git-rebase - Reapply commits on top of another base tip
Yancey
2016-08-08 09:57:38 +08:00
@vitovan rebase 不行。。 rebase 是当前的回到某个时间点或 commits 。 现在是要把某个时间点之前的丢掉
Yancey
2016-08-08 10:00:04 +08:00
@vitovan sorry 看错,以为你说的 reset 。 rebase 是可以。但是一般服务器的仓库是一个裸仓库(没有工作目录), git rebase , git branch 命令都没法使用。。如果在本地操作,强推到服务端。所有分支都会混乱、、
lijianying10
2016-08-08 10:02:59 +08:00
删掉本地仓库然后
git clone --depth=6 https://xxxxxxx.git
看看这种行不行?
mengzhuo
2016-08-08 10:07:08 +08:00
本地 gc 一次 减少空间
而且删 commit 很不可取啊
relaxgo
2016-08-08 10:12:29 +08:00
试试这个方案 [git 替换]( https://git-scm.com/book/zh/v2/Git-工具-替换)
Yancey
2016-08-08 10:13:08 +08:00
@lijianying10 这种治标不治本啊。。
vitovan
2016-08-08 10:13:59 +08:00
r#6 @Yancey 「如果在本地操作,强推到服务端。所有分支都会混乱」,为啥(扣鼻状)?
我是 Git 小白,求教...
shenqi
2016-08-08 10:14:52 +08:00
既然都打算这样了,就直接那个新的仓库,旧的仓库随时能查看就行了。
Yancey
2016-08-08 10:15:04 +08:00
@mengzhuo commits 是确定不会再用的, 所以要删掉。。 gc 一次 200M 顶多到 160M 。
forcecharlie
2016-08-08 10:18:41 +08:00
git clone --depth 会从最新的 commit 迭代回去,并不是完整的 repository ,一些额外的操作需要还原成完整的仓库, 在服务器上进行 git gc ---prune=now 可以一定程度的减小仓库体积. 一个思路是,扫描出 仓库中大文件提交时的 父 commit, 然后将分支强制设置为此 commit,即修改 .git/refs/heads/xxxx 的 commitid ,工作目录删除此大文件,然后创建提交,运行 git gc, 强制推送到服务器,服务器运行 git gc . 这样仓库的体积就可以减小了,这个实际上和 git rebase 类似,但不会丢失当前的 commit. 对于你的需求, git commit 的创建由父 commit 根 tree,提交者 提交信息等通过 sha1 创建,是链式的,牵一发而动全身. 所以你的不太好实现.
Yancey
2016-08-08 10:19:43 +08:00
@vitovan 因为丢掉历史,会让从截断的地方到现在最新的 commit 的 ID 都改变,也就是相当于把所有的留下的 commits 都重新提交了一遍。 这个时候服务端和本地 commits 没有一个是能对应上的。强行 push 我们期望的效果是 服务端的 commits 和分支记录 都完全被更改过的本地 commits 替换掉。。但是 git 并不会这样。
Yancey
2016-08-08 10:22:22 +08:00
@forcecharlie 对啊。截断的效果就是从截断到现在最新的 commits 所有的 SHA
Yancey
2016-08-08 10:24:26 +08:00
@Yancey 对啊。截断导致结果就是从截断到现在最新的 commits 所有的 SHA1 值都会改变。。因为是公开的项目。很多人已经克隆了。。对本地的影响很大。
@forcecharlie
kukat
2016-08-08 10:27:22 +08:00
~ du -sh .git
758M .git
bjzhou1990
2016-08-08 10:28:37 +08:00
Yancey
2016-08-08 10:29:04 +08:00
@kukat 你这还不减? 我们一个工程就这么大。总共几十个工程。。。源码编译的时候硬盘受不了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297802

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX