6

有人将所有二进制文件提交到我们的集市主干,我想摆脱它。`bzr del file' 只从当前版本中删除文件,而不是文件的历史记录。

有没有办法我们可以删除文件历史记录,这样我们就不必下载数百 MB 的数据?

4

3 回答 3

6

有2种方式。但是您需要准备好重新创建部分(甚至全部)分支历史记录,因此在删除文件后,您当前的(本地)分支将与新分支不兼容。

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

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

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

于 2010-02-15T13:02:40.957 回答
3

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

bzr uncommit

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

查看关于撤消错误的集市文档以获取更多详细信息。

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

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

于 2010-02-15T12:40:13.533 回答
0

我一直在寻找一种方法来摆脱 CVS/ 目录,这使它成为我所有 bzr 提交的方式。我是 bzr 的新手,所以当时我还不确定我将如何处理它们。(在工作中,中央仓库是 CVS,但我在本地使用 bzr 来帮助我)。这是我为摆脱项目中的一些 CVS 目录所做的一个示例,它并不是完美的,而是一个快速的 hack :)

您在 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

脚本_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

现在目录“new.import”将包含除您过滤掉的内容之外的所有内容。
运行以下脚本以查看新导入的整个修订历史记录,以查找可能仍然存在、您不想要的内容,您应该在 Script_1 中添加另一个 -x 值(然后我将重新运行,直到我满意为止)

脚本_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。
  • 重复
于 2014-09-17T13:54:34.333 回答