****************************************************************************** COMPARISON WITH OTHER VCS FOR ISSUE #516: OBLITERATE ****************************************************************************** TABLE OF CONTENTS 1. INTRODUCTION 2. COMPARISON MATRIX 3. PERFORCE 4. CVS 5. CLEARCASE 6. MERCURIAL 7. GIT 1. INTRODUCTION This document describes how obliteration works in some other Version Control Systems. 2. COMPARISON MATRIX This table indicates whether and how three different goals can be accomplished in Subversion (prior to development of the Obliterate feature) and other version control systems. +-------------+-------------------+-------------------+-------------------+ | | Quick hiding | Space recovery | Latest only | +-------------+-------------------+-------------------+-------------------+ | | | | | | Subversion | Apache authz? | dump/filter/load | NO | | (1.6) | Hook scripts? | | | | | | | | | Perforce | p4 obliterate | p4 obliterate | YES | | | p4 protect | | | | | | | | | CVS | Admin manual task | Admin manual task | NO ? | | | | | | | ClearCase | rmversion/rmelem | rmversion/rmelem | ? | | | | | | | Mercurial | ? | ? | ? | | | | | | | GIT | ? | ? | ? | | | | | | +-------------+-------------------+-------------------+-------------------+ 3. PERFORCE Perforce has a client-side command for obliterating file-revs from the repository. Invocation: Client side. p4 obliterate [-y] file[rev-range] ... Authz: Restricted by the "admin" priviledge which, like other privilege levels in Perforce, can be granted per user on arbitrary paths in the repository. Repository transformation: The file becomes nonexistent at the specified revision. At all other revisions it is unchanged. If the head revision of that file was obliterated, the head file-revision number of that file will go back to the highest remaining revision, and the next revision to be committed will have a file-revision number that has been used before. The repository-scope "changelist" numbers are not affected. Client (WC) issues: If a file is obliterated at all revisions, this file becomes unversioned in WCs and/or is removed from WCs by a "sync" command (that's not clear). If a file is obliterated at only specified revisions, according to the manual: "Syncing to an obliterated revision will remove the file from your client workspace, syncing to the head revision will [...] provide you with the most recent non-obliterated revision of the file." Backups, Mirrors: ### ? Relevant differences between Subversion and Perforce: In Perforce, only files are versioned, and files are tracked primarily by their path (with some support for renaming, moving and replacing). Perforce maintains both a file-revision number and a repository-scope "changeset" number (which is similar to Subversion's revision number). Perforce does not maintain client-side state for the WCs so the new state is immediately seen when any Perforce operation is attempted. Reference manual: <http://www.perforce.com/perforce/doc.current/manuals/cmdref/obliterate.html> 4. CVS CVS has no special support for obliterating, but it is established practice for administrators to obliterate the whole history of a file by deleting the corresponding archive file from the repository. CVS has little repository-side metadata outside the per-file RCS archive files, so deleting one of these achieves total obliteration of the corresponding file through all its revisions. Invocation: Server side, native operating system commands. Authz: Implicit (requires server file-system privileges). Repository transformation: The file's existence and its history is deleted, including its change logs. Client (WC) issues: ### Backups, Mirrors: ### ? 5. CLEARCASE 6. MERCURIAL Mercurial has no Obliterate command. This email describes how one might achieve obliteration: <http://www.selenic.com/pipermail/mercurial/2008-March/017859.html>. 7. GIT Git has a "git-filter-branch" command which can be used to achieve obliteration. See the manual page <http://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html>.