[unknown button type]

Version Control Systems

One of the goals of RabbitVCS is to become VCS neutral (starting with official Git support in the 0.14 release), see roadmap. This page is used for brainstorming about how to achieve this goal.

Git

  • As far as I can tell, Git only cares about files, not directories. The only way I can think up of to tell if a directory inside a working copy is unversioned is by checking if it has any files inside that are versioned (this includes added), if that isn't the case the directory is unversioned.
  • A directory should be regarded as “added” if it only has (1 or more) descendants that are “added”.

Mapping VCS Commands

SVN SVN Module Git Git Module Status
Add add.py, SVNAdd Stage1 stage.py, GitStage Removed
Annotate annotate.py, SVNAnnotate Annotate annotate.py, GitAnnotate Done
Apply Patch applypatch.py, SVNApplyPatch Apply Patch applypatch.py, GitApplyPatch Done
Branch branch.py, SVNBranch Manage Branches2 branch-manager.py, GitBranchManager Done
Browser browser.py, SVNBrowser Browser browser.py, GitBrowser Removed
Changes changes.py, SVNChanges Changes changes.py, GitChanges Done
Check for Modifications checkmods.py, SVNCheckMods Check for Modifications checkmods.py, GitCheckMods Use Pull
Checkout checkout.py, SVNCheckout Clone clone.py, GitClone3 Done
Cleanup cleanup.py, SVNCleanup N/A N/A N/A
Commit commit.py, SVNCommit Commit commit.py, GitCommit Done
N/A N/A Push push.py, GitPush Done
Create Patch createpatch.py, SVNCreatePatch Create Patch createpatch.py, GitCreatePatch Done
Create Repository create.py, SVNCreateRepository Initialize Repository create.py, GitCreate Done
Delete delete.py, SVNDelete Delete delete.py, GitDelete Done
Diff diff.py, SVNDiff Diff diff.py, GitDiff Done
Export export.py, SVNExport N/A N/A Done
Ignore ignore.py, SVNIgnore Ignore ignore.py, GitIgnore Done
Import import.py, SVNImport N/A N/A N/A
Lock lock.py, SVNLock N/A N/A N/A
Merge merge.py, SVNMerge Merge merge.py, GitMerge Done
Show Log log.py, SVNLog Show Log log.py, GitLog Done
Properties properties.py, SVNProperties N/A N/A4 N/A
Relocate relocate.py, SVNRelocate Rebase rebase.py, GitRebase
Rename rename.py, SVNRename Rename rename.py, GitRename Done
Resolve resolve.py, SVNResolve N/A N/A N/A
Revert revert.py, SVNRevert Revert revert.py, GitRevert5 Done
Revision Properties revprops.py, SVNRevisionProperties N/A N/A N/A
Settings settings.py Settings settings.py Done
Switch switch.py N/A switch.py
N/A N/A Tag Manager tag-manager.py, GitTagManager Done
N/A N/A Manage Remotes remotes.py, GitRemotes Done
Unlock unlock.py, SVNUnlock N/A N/A N/A
Update update.py, SVNUpdate Fetch/Pull update.py, GitUpdate Done

Mapping Footnotes

  1. Staging is really just preparing the repository to commit the file, which is somewhat different from SVN. In SVN, you have versioned and unversioned files. To commit an unversioned file you must first “Add” it, then it can be committed any time. With Git, both versioned and unversioned files are staged before being committed. However, because of the way our UI works, we don't need separate staging dialogs. It is all done within the commit window.
  2. In SVN, branches are physically represented by directories and files in your filesystem and can be managed via your file browser or our repository browser. In Git, branches are simply sets of SHA1 hashes that are stored in the repository. As such, we need to create a dialog to manage them.
  3. GitClone will subclass checkout.Checkout
  4. Git has a repository-wide config file, but not file-specific properties, so this doesn't match up perfectly. We need a dialog specifically for editing git configuration files, which are weird ini files. This is easy with gittyup's config library. Other than the repository config file, there is also the ~/.gitconfig file that is user-specific and the system-wide /etc/gitconfig file. The gittyup config library handles this transparently, but it is something to keep in mind. Also, there are the .gitignore and /info/exclude files which are slightly different and also handled by gittyup.
  5. GitRevert will subclass add.Add. Revert isn't really proper git terminology; git sometimes uses “discard” or “checkout from head”, but we already have revert, which I think is applicable and understandable for our users.