我已经清理了我们的Git存储库,需要从历史记录中删除大部分内容。我是这样做的:
git filter-branch --prune-empty --tree-filter 'rm -rf some_stuff'
--prune-empty
标志将删除在过程结束后留下空的提交(除了有多个父级的合并提交)。即使合并的分支绝对没有内容,而且合并也没有添加任何内容到树中。
我如何从历史记录中删除这些空的合并提交?
我已经清理了我们的Git存储库,需要从历史记录中删除大部分内容。我是这样做的:
git filter-branch --prune-empty --tree-filter 'rm -rf some_stuff'
--prune-empty
标志将删除在过程结束后留下空的提交(除了有多个父级的合并提交)。即使合并的分支绝对没有内容,而且合并也没有添加任何内容到树中。
我如何从历史记录中删除这些空的合并提交?
这种方法比变基解决方案更优越,因为它可以保留原始历史的提交者信息、提交日期和非空合并。
git filter-branch --prune-empty --parent-filter \
'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'
xargs
和sed
。在对ssokolow/profile的副本运行filter-branch
以分离出ssokolow/lap后,我需要这样做。
这个命令相当不错,可以自动"折叠掉由--prune-empty
留下来的任何残余内容":
git rebase --root HEAD
(我需要使用--root
选项,以便用最早仍有内容的提交替换现在为空的初始提交。)
git rebase
和git am
的文档(git rebase
委托给它),我认为使用--committer-date-is-author-date
应该可以。我还没有自己尝试过,但我即将尝试。 - eestradagit rebase
命令要求我修复数百个“error: could not apply”错误。有没有一种方法可以跳过它们全部? - Cœurgit filter-branch -f --prune-empty --parent-filter FULL_PATH_TO/rewrite_parent.rb master
rewrite_parent.rb
:
#!/usr/bin/ruby
old_parents = gets.chomp.gsub('-p ', ' ')
if old_parents.empty? then
new_parents = []
else
new_parents = `git show-branch --independent #{old_parents}`.split
end
puts new_parents.map{|p| '-p ' + p}.join(' ')
git-filter-repo
中,--prune-degenerate
选项可用于此操作:
[合并提交]可能会因为修剪其他提交(具有少于两个父级,将一个提交作为两个父级,或将一个父级作为另一个的祖先)而变得退化。如果这些合并提交没有文件更改,则[将被]修剪。
git filter-repo --prune-degenerate always
请记住,上述命令默认适用于整个存储库。如果您想限制影响,可以指定--refs
。
我的解决方案是将所有内容移动到子目录(历史记录),然后使用--subdirectory-filter
我稍微修改了sh文件:
#!/bin/bash
git ls-files -s | sed "s-\t-&temp_dir/-" | GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" || true
运行
git filter-branch --index-filter '~/doit.sh' HEAD
第二步
git filter-branch --subdirectory-filter temp_dir --prune-empty
并将其推送。
我在这里找到了一个非常可爱的小包装脚本,它围绕着filter-branch。
https://github.com/pflanze/chj-bin/blob/master/cj-git-filter-branch
前置条件和背景:
http://lists.q42.co.uk/pipermail/git-announce/2011-September/000486.html
man git filter-branch
:“如果您不希望保留具有单个父级且对树没有更改的提交,则可以使用git_commit_non_empty_tree“$ @”而不是git commit-tree“$ @”。但合并提交具有多个父级。因此,它与--prune-empty
标志相同。我尝试了一下,它没有修剪空的合并提交。 :/ - Bjarke Freund-Hansen
sed "s/-p //g" | xargs git show-branch --independent | sed "s/^/-p /g" | tr "\n" " "
对我来说似乎可行。 - James EJbrew install gnu-sed findutils
,这样你就可以使用 gsed 替换 sed,gxargs 替换 xargs,享受 GNU 带来的好处。 - Dave Gregory