git - 从 git 存储库中删除最旧的提交

标签 git

<分区>

Possible Duplicate:
Completely remove (old) git commits from history

git 对于客户端网站的夜间快照非常有用。知道一切(php + mysqldump + 用户文件上传)都在 git 存储库中,这让您高枕无忧。

由于某些网站的规模很大,我想知道是否有人知道一种适度简单的方法来删除(例如)所有超过 30 天的提交?

最佳答案

的确,您实际上可以做到这一点。这有点棘手。这是一个例子...

$ cd /tmp
$ mkdir rmcommits
$ cd rmcommits
$ git init
Initialized empty Git repository in /tmp/rmcommits/.git/
$ cp /tmp/example/xy.c .
$ git add xy.c
$ git commit -m 'initial commit'
[master (root-commit) 8d5b88c] initial commit
 1 files changed, 273 insertions(+), 0 deletions(-)
 create mode 100644 xy.c
$ echo 'more stuff' > morestuff.txt
$ git add morestuff.txt; git commit -m 'add some stuff'
[master f971ae5] add some stuff
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 morestuff.txt
$ echo 'and still more' >> morestuff.txt 
$ git add morestuff.txt; git commit -m 'add more stuff'
[master bea9192] add more stuff
 1 files changed, 1 insertions(+), 0 deletions(-)

现在我选择我想要“历史结束”的地方(对于分支主管,又名 HEAD):

$ git rev-parse HEAD^
f971ae5b4225aca364223a44be8be84268385ff3

这是我要保留的最后一次提交。

$ git filter-branch --parent-filter 'test $GIT_COMMIT == f971ae5b4225aca364223a44be8be84268385ff3 && echo "" || cat' HEAD
Rewrite bea9192a53a5aeb7532aa1e174f7f642363396de (3/3)
Ref 'refs/heads/master' was rewritten
$ git log --pretty=oneline
65a246b8320382a64550d2c4b650c942d7bfba70 add more stuff
7892ab45aa33cd5ebdc3090ce2622081059fdd79 add some stuff

(说明:git filter-branch 基本上遍历分支中的所有提交,在本例中为 master 因为 HEAD 当前 ref: refs/heads/master,并使用 --parent-filter,你可以重写每个提交的父级。当我们找到目标提交时,我们希望历史在此之前停止,我们echo nothing——你不需要空字符串,这是我从没有参数的 echo 什么都不做时的老习惯——否则我们使用“cat”来复制现有的 -p 参数,根据 filter-branch 手册。这使得新提交,基于我们测试的那个,没有 parent ,也就是说,它现在是一个初始提交——分支的根。这在 git 仓库中是不寻常的,因为我们现在有两个根提交,一个在新的master 和一个在旧的、保存的 master 上,如下所述。)

请注意,较旧的提交树仍完整地保留在存储库中,使用 git filter-branch 使用的保存名称:

$ git log original/refs/heads/master --pretty=oneline
bea9192a53a5aeb7532aa1e174f7f642363396de add more stuff
f971ae5b4225aca364223a44be8be84268385ff3 add some stuff
8d5b88c468f75750d5a01ab40bfae160c654ac66 initial commit

您必须删除该引用(并清除 reflog)并在重写提交(以及任何未引用的树、blob 等)真正消失之前执行“git gc”:

$ git update-ref -d refs/original/refs/heads/master
$ git reflog expire --expire=now --all
$ git gc --prune=now
$ git fsck --unreachable
$

最后一行表明他们真的走了。

关于git - 从 git 存储库中删除最旧的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9765391/

相关文章:

git - 寻找一种方法来克隆 github 项目的问题

git - fork 一个 git repo 的目的是什么?

git - 查找文件首次添加到 Git 存储库的日期/时间

git - 恢复 git-svn 克隆

git - 我如何强制 git 认为文件未 merge ?

git - 如何删除 merge 提交

Android Studio 更新项目 : Merge vs Rebase vs Branch Default

git - 如何更新git中的目录

git - 如何为我的新 gitlab 帐户生成新的 ssh-key?

git - 超越同时比较 Diff 2 分支