<分区>
Possible Duplicate:
Completely remove (old) git commits from history
git 对于客户端网站的夜间快照非常有用。知道一切(php + mysqldump + 用户文件上传)都在 git 存储库中,这让您高枕无忧。
由于某些网站的规模很大,我想知道是否有人知道一种适度简单的方法来删除(例如)所有超过 30 天的提交?
标签 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/