用bazaar删除文件历史记录

时间:2010-02-14 18:21:37

标签: repository bazaar

有人把所有二进制文件都交给我们的集市主干,我想摆脱它。 `bzr del file'只删除当前版本的文件,但不删除文件的历史记录。

我们是否有办法删除文件历史记录,以便我们不必全部下载数百MB的数据?

3 个答案:

答案 0 :(得分:6)

有两种方法。但是您需要准备好重新创建分支历史记录的一部分(甚至是完整的),这样在删除文件后,当前(本地)分支将与新分支不兼容。

1)手动方式。您可以在添加大文件之前创建分支的副本以进行修订。然后,您需要半手动重新提交进一步的修订并排除大文件。使用bzr-rewrite插件(以前的bzr-rebase)中的replay命令重放那些不存在大文件更改的修订版。并使用merge -cN进行对大文件更改的修订,手动删除这些文件并提交。因此,您将保留大部分历史记录,并为分支的其他文件保留唯一的文件ID。

2)使用bzr-fastimport插件将历史记录导出为bzr fast-export命令的快速导入流。然后使用bzr fast-import-filter -x FILE命令过滤掉大文件。最后,使用bzr fast-import命令重新创建没有大文件的新分支。这个方法会破坏你的所有历史记录,你的所有文件都会获得新的文件ID,所以你的新分支将与旧分支完全不兼容。

在任何情况下,如果您拥有包含大文件历史记录的共享存储库,则需要创建新的空共享存储库并将新的过滤分支放在那里。

答案 1 :(得分:3)

如果在上次提交中添加了二进制文件,则可以取消提交。

bzr uncommit

这将使您的工作树处于您编写“bzr commit”之前的状态。然后删除文件并重新提交。

查看undoing mistakes上的集市文档了解更多详情。

您可以使用-r选项在一个操作中撤消多个提交:bzr uncommit -r -4

其他选项,如果您不关心修订历史:
您可以导出分支(bzr export DESTINATION),然后创建新的主干 export命令将只导出头部存储库,没有任何历史记录。

答案 2 :(得分:0)

我一直在寻找一种摆脱CVS / dirs的方法,这使得它进入我所有的bzr提交。我是bzr的新手,所以当时我还不确定如何处理它们。 (在工作中,中央回购是CVS,但我在本地使用bzr来帮助我)。 这是我在我的项目中摆脱一些CVS dirs所做的一个例子,它不是完美的,而是一个快速的黑客:)

您在dir / home / user / dev

中有一个名为'projAAA'的项目

导出当前的bzr项目(用于bzr导入)

cd /home/user/dev  
bzr fast-export --no-plain projAAA export.gz

将该导出移动到空目录(由于某种原因,过滤器会查看其运行的其他目录)

cp export.gz ~/tmp/rewrite/  
cd ~/tmp/rewrite

Script_1

此脚本将导出并过滤您提供的所有内容-x
不幸的是-x似乎不适用于通配符,因此您必须提供准确的值/路径/文件 它在〜/ tmp / rewrite

中运行
#!/bin/bash  
rm -r new.import/ out.filtered  
bzr fast-import-filter -x gradle/wrapper/CVS -x gradle/CVS -x .cvsignore* -x .cvsignore -x ChangeFile -x src/main/groovy/cvs/util/CVS -x src/main/groovy/cvs/CVS -x src/main/groovy/CVS -x src/main/java/cvs/util/CVS -x src/main/java/cvs/CVS -x src/main/java/CVS -x src/main/resources/CVS -x src/main/CVS -x src/test/groovy/cvs/util/CVS -x src/test/groovy/cvs/CVS -x src/test/groovy/CVS -x src/test/resources/CVS -x src/test/CVS -x src/CVS -x CVS export.gz > out.filtered  
bzr fast-import out.filtered new.import

现在dir“new.import”将包含你过滤掉的所有内容 运行以下脚本来查看新导入的整个修订历史记录,查找可能仍然存在的内容,您不想要的内容,您应该在Script_1中添加另一个-x值(我将重新运行直到我开心)< / p>

Script_2:

在〜/ tmp / rewrite中运行:

#!/bin/bash  

THISDIR=$(pwd)
pushd new.import/trunk/

#clean file
echo `date` > $THISDIR/search.out

# I manually enter the revisions that exist here, if you only have 1 to 19, change this accordingly:
for i in `seq 1 70`;
do
  echo $i
  printf "\n============== rev $i =================\n" >> $THISDIR/search.out
  bzr revert -r$i
  # Change this find to look for things you want to filter out
  find . -name CVS -type d >> $THISDIR/search.out 2>&1
done

popd

如果您现在查看search.out内部,您可以看到搜索找到的内容,然后将其添加到上一个脚本中,直到您满意为止。

所以,从本质上讲,我重复这几次,直到我开心为止;

  • 运行Script_1以导出,过滤,重写分支。
  • 然后Script_2搜索新分支以确保它已全部消失,如果没有,则添加更多-x 条目
  • 重新推荐Script_1。
  • 重复