Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除Git存储库中历史记录中的空合并提交_Git_Git Filter Branch - Fatal编程技术网

删除Git存储库中历史记录中的空合并提交

删除Git存储库中历史记录中的空合并提交,git,git-filter-branch,Git,Git Filter Branch,我已经清理了我们的Git存储库,我们需要从历史中删除大部分。我使用以下方法进行此操作: git过滤器分支--删除空--树过滤器'rm-rf some_stuff' --prune empty标志将删除进程结束后保留为空的提交,但具有多个父级的提交(合并提交)除外。即使正在合并的分支完全不包含任何内容,并且合并不会向树中添加任何内容 如何从历史记录中删除这些空的合并提交?我在筛选器分支周围发现了一个非常可爱的小包装脚本: 此处的预设和背景: 因此,我的解决方案是将所有内容移动到sub dir(

我已经清理了我们的Git存储库,我们需要从历史中删除大部分。我使用以下方法进行此操作:

git过滤器分支--删除空--树过滤器'rm-rf some_stuff'
--prune empty
标志将删除进程结束后保留为空的提交,但具有多个父级的提交(合并提交)除外。即使正在合并的分支完全不包含任何内容,并且合并不会向树中添加任何内容


如何从历史记录中删除这些空的合并提交?

我在筛选器分支周围发现了一个非常可爱的小包装脚本:

此处的预设和背景:


因此,我的解决方案是将所有内容移动到sub dir(历史),然后再移动到
--子目录过滤器

第一步

我对sh文件做了一些修改:

#/bin/bash
git ls files-s | sed“s-\t-&temp_dir/-”| git_INDEX_FILE=“$git_INDEX_FILE.new”git更新索引--索引信息
mv“$GIT_INDEX_FILE.new”$GIT_INDEX_FILE”| true

git过滤器分支--索引过滤器'~/doit.sh'头
第二步

git filter-branch --subdirectory-filter temp_dir --prune-empty

然后推它

我需要在对的副本运行
过滤器分支
后执行此操作以分离

作为一个自动“通过
--prune empty
”命令折叠掉任何残留的内容,这做得不错:


(我需要
--root
,这样它就可以用仍然有内容的最旧的初始提交替换现在为空的初始提交。)

这看起来对我有效:

重写\u 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过滤器分支--删除空--父过滤器\

“sed”s/-p//g“| xargs-r git show branch--independent | sed”s/\它不起作用。从
man git filter branch
:“如果您不希望将提交保存在单亲上,并且不对树进行任何更改,也可以使用git_commit_non_empty__tree”$@“而不是git commit tree”$@”。“但是合并提交有多个父级。因此,它的作用与
--prune empty
标志相同。我尝试了它,但它不会删除空的合并提交:/啊,好吧,该死。那时还需要更多的研究。Brb.检查包装器脚本。我无法让perl脚本工作,我得到一个
无法在@INC中找到Chj/xperlfunc.pm…
错误。如果我在谷歌上搜索xperlfunc,我不会发现任何有用的东西。你成功地使用了这个脚本吗?很抱歉,忘记了一个有用的链接,尽管在某些情况下有些过分了。值得注意的是,这种方法会将所有合并平坦化,而不仅仅是空合并。还要注意的是,这会将GIT_提交人_日期重置为GIT rebase默认设置的日期。@ElanRuusamäe:你知道避免这种情况的方法吗(即保留原始提交人信息)?@Thilo:查看
GIT rebase
GIT am
(git rebase委托给的),我认为使用
--committer date is author date
应该行得通。我自己还没有尝试过,但我即将尝试。这个
git rebase
命令要求我修复数百个“错误:无法应用”。有没有办法跳过它们?对我来说是最简单的解决方案,因为不需要外部脚本。在OSX上
sed“s/-p//g”| xargs git show branch--independent | sed“s/^/-p/g”| tr“\n”“”
似乎对meDoes有效,但不从底层树中删除合并提交,即合并两个空提交(每个都没有祖先)另一个macOS选项:
brew安装gnu sed findutils
,这样您就可以用gsed替换sed,用gxargs fpr gnu替换xargs。
git filter-branch -f --prune-empty --parent-filter FULL_PATH_TO/rewrite_parent.rb master 
#!/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(' ')