我们团队中的某个人意外提交了包含我们存储库密码的文件。密码不容易改变。删除SVN提交的所有痕迹
有没有一种方法,具有完全的管理权限,删除此提交的所有痕迹?我不是在谈论恢复或删除,这显然会将密码保留在文件历史记录中。
我们团队中的某个人意外提交了包含我们存储库密码的文件。密码不容易改变。删除SVN提交的所有痕迹
有没有一种方法,具有完全的管理权限,删除此提交的所有痕迹?我不是在谈论恢复或删除,这显然会将密码保留在文件历史记录中。
是的,但它并不适合心灵的隐隐。您必须使用svnadmin dump
和svnadmin load
重新创建您的存储库。
如果您选择这样做,第一步是停止您的用户提交,并对您的存储库进行备份。我还建议您通过您的存储库副本上的步骤进行操作;您可以使用rsync
将整个存储库目录复制到一个临时目录中,然后从那里开始工作。
对于这些指令,我会在临时目录下创建一个新的仓库:
tmp, 502> svnadmin create example.repo
tmp, 503> svn co file://`pwd`/example.repo example
Checked out revision 0.
我创建了一个包含4次修订,第三它需要被删除的文件:
example, 536> svn log test.txt
------------------------------------------------------------------------
r4 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line
post-bad commit
------------------------------------------------------------------------
r3 | kgregory | 2011-04-06 08:46:42 -0400 (Wed, 06 Apr 2011) | 1 line
bad revision
------------------------------------------------------------------------
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line
good revision
------------------------------------------------------------------------
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line
initial revision
------------------------------------------------------------------------
因此,我们需要使用-r
标志来指定修订范围,以便在坏的之前和之后转储修订版本。第二次转储中的--incremental
标志很重要,因为它会告诉加载命令不要创建新文件。
请注意,我从持有存储库的相同目录运行这些命令。
svnadmin dump -r 1:2 example.repo/ > pred.svndump
* Dumped revision 1.
* Dumped revision 2.
tmp, 552> svnadmin dump -r 4:4 --incremental example.repo/ > succ.svndump
* Dumped revision 4.
现在移动原仓库的方式进行,并使用相同的名称创建一个空仓库:
tmp, 540> mv example.repo example.repo.bak
tmp, 541> svnadmin create example.repo
并导入转储文件的内容。
tmp, 569> svnadmin --quiet load example.repo < pred.svndump
tmp, 570> svnadmin --quiet --ignore-uuid load example.repo < succ.svndump
现在告诉大家删除他们的工作目录,并检查出新鲜。你应该看到以下日志:
example, 574> svn log test.txt
------------------------------------------------------------------------
r3 | kgregory | 2011-04-06 08:46:59 -0400 (Wed, 06 Apr 2011) | 1 line
post-bad commit
------------------------------------------------------------------------
r2 | kgregory | 2011-04-06 08:46:28 -0400 (Wed, 06 Apr 2011) | 1 line
good revision
------------------------------------------------------------------------
r1 | kgregory | 2011-04-06 08:46:02 -0400 (Wed, 06 Apr 2011) | 1 line
initial revision
------------------------------------------------------------------------
有一个巨大的警告:此过程假定有没有因为受到任何提交的文件中的错误提交(即后继转储只包含的变化到其他文件)。
如果不是这种情况,您仍然可以删除修订版,但这需要更多的工作。您需要创建一个新的签入,其中包含该文件的干净副本以及任何其他随文件一起更改的文件。然后创建多个dumpfiles,排除包含坏文件的任何修订。
最后:我强烈建议几次干运行。正如你可以从我的例子中的历史数字中看到的,我搞砸了几次。正如我在开始时所说的,将Subversion版本库复制到临时目录很容易。当你这样做的时候,你可以继续尝试,直到你把它做好,然后把固定的存储库复制回原处。
见在FAQ
答案有一些特殊情况下,您可能要销毁文件的全部证据或提交。 (也许有人不小心犯了一个机密文件。)这并不容易,因为Subversion是故意设计的,永远不会丢失信息。修订是不可改变的树,它们彼此相互构建。从历史记录中删除修订版会导致多米诺骨牌效应,在随后的所有修订中造成混乱,并可能使所有工作副本无效。
但是,该项目计划在某一天实施一个svnadmin obliterate命令,该命令可以完成永久删除信息的任务。 (请参阅问题516.)
与此同时,您唯一的方法是使用svnadmin转储您的存储库,然后通过svndumpfilter(不包括坏路径)将转储文件转储到svnadmin加载命令中。有关详细信息,请参阅Subversion手册的第5章。
请注意,'svndumpfilter'只知道如何包含或排除路径。除非你小心,否则文件可能会完全消失。 – kdgregory 2011-04-06 13:11:56
感谢您的详细解答。知道了这一点,我们认为改变密码更简单,而不是通过你描述的步骤。 – MasterScrat 2011-04-07 13:38:20