<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Git on Random notes from mg</title>
    <link>https://mg.pov.lt/blog/tags/git.html</link>
    <description>Recent content in Git on Random notes from mg</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>marius@gedmin.as (Marius Gedminas)</managingEditor>
    <webMaster>marius@gedmin.as (Marius Gedminas)</webMaster>
    <copyright>Copyright © 2004–2020 Marius Gedminas</copyright>
    <lastBuildDate>Mon, 20 Feb 2012 23:17:58 +0200</lastBuildDate>
    <atom:link href="https://mg.pov.lt/blog/tags/git/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Converting a gnarly SVN repository to GIT: success!</title>
      <link>https://mg.pov.lt/blog/eazysvn-git-migration-success.html</link>
      <pubDate>Mon, 20 Feb 2012 23:17:58 +0200</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/eazysvn-git-migration-success.html</guid>
      <description>
&lt;p&gt;I&#39;ve received more feedback about my last night&#39;s post on &lt;a
href=&#34;https://mg.pov.lt/blog/eazysvn-git-migration.html&#34;&gt;gnarly
svn to git migration&lt;/a&gt; than I&#39;ve expected.  Thanks to that feedback
(and, mostly, Raffaele Salmaso for doing almost all the work and emailing the
result to me) &lt;a href=&#34;https://github.com/mgedmin/eazysvn&#34;&gt;eazysvn is now on
  GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rest of this post will describe the conversion (and verification)
in detail, because if I ever need to do this again, I do not want to start
from scratch.&lt;/p&gt;

&lt;!--BREAK--&gt;

&lt;h4&gt;Part one: unexpected gift&lt;/h4&gt;

&lt;p&gt;Raffaele Salmaso did a heroic job and sent me a tarball with a mercurial
repository, produced with &#34;something like&#34; this:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&amp;gt; hg clone --layout single $SVN repo-tmp
&amp;gt; hg convert --filemap filemap repo-tmp repo
&amp;gt; cd repo
&amp;gt; hg qinit
&amp;gt; hg qimport -r 0:tip
&amp;gt; hg qpop -a
&amp;gt; cd .hg/patches
&amp;gt; check patches for correctness
&amp;gt; fix tags (svn are different from mercurial ones)
&amp;gt; hg qfinish -a
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;The conversion had only two problems:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;it introduced new commits that modify a new file &lt;tt&gt;.htags&lt;/tt&gt;&lt;/li&gt;
  &lt;li&gt;it changed the contents of README.txt in changeset 53 (corresponding to
      svn revision 55, &#34;Allow branch names to have prefixes.&#34;) and newer
      versions:
  &lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;&lt;pre&gt;
--- svn version
+++ hg version
-  *scheme://server/path/to/svn/repo*/*subdirs*
+  *scheme://server/path/to/svn/repo*/trunk/*subdirs*
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;
I did not notice either problem at first.
&lt;/p&gt;

&lt;h4&gt;Part two: conversion to git&lt;/h4&gt;

&lt;p&gt;
Note: I wrote this up &lt;em&gt;after&lt;/em&gt; I&#39;ve done everything up to and including
part five.  The commands and directory names here are not the actual commands
and directories I&#39;ve used; although I tried to be accurate.  I&#39;ve also skipped
some false trails.
&lt;/p&gt;

&lt;p&gt;
Converting hg to git was pretty easy:
&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir -p /tmp/conv&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/conv&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;tar xvjf eazysvn_20120220-133823.tar.bz2&lt;/span&gt;
creates /tmp/conv/eazysvn/
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir eazysvn-git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd eazysvn-git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git init&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;hg-fast-export -r /tmp/conv/eazysvn&lt;/span&gt;
converts, leaves no working tree; git status shows all files as deleted
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git checkout&lt;/span&gt;
restore working tree
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;I was a bit surprised by git status showing a bunch of deleted files at the
end there.  I suppose hg-fast-export expects to be run inside a bare
repository, or maybe it expects the user to know enough git to understand what
happened and do the &lt;tt&gt;git checkout&lt;/tt&gt; if necessary.&lt;/p&gt;

&lt;h4&gt;Part three: cleanup&lt;/h4&gt;

&lt;p&gt;I wanted to drop the empty changesets that were introduced by Raffaele&#39;s
conversion process for modifying &lt;tt&gt;.hgtags&lt;/tt&gt;.  Since the manual page for
git filter-branch had an example for dropping all empty changesets, I used it
directly.&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git filter-branch --commit-filter &#39;git_commit_non_empty_tree &#34;$@&#34;&#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;This also dropped some changesets that were present in my Subversion
repository -- those that manipulated svn properties, and the one that moved
everything in svn root under /trunk.  I won&#39;t miss those.&lt;/p&gt;

&lt;p&gt;Note: if you try&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git filter-branch --commit-filter=&#39;git_commit_non_empty_tree &#34;$@&#34;&#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;(i.e. &#39;&lt;tt&gt;=&lt;/tt&gt;&#39; instead of a space after &lt;tt&gt;--commit-filter&lt;/tt&gt;), you will
get a completely baffling error message that doesn&#39;t even hint at what is
wrong.&lt;/p&gt;

&lt;p&gt;At this point I ran &lt;tt&gt;gitk --all&lt;/tt&gt; to look around and discovered that
git filter-branch left all the tags pointing to obsolete revisions.  I created
new tags manually with gitk, including some that were missing in my svn
repository.  Every release since 1.6.0 is now tagged (releases before that
did not have source tarballs on PyPI, so I had no way to verify which checkin
corresponded to which release).  I also changed the tag naming scheme to be
&#34;v1.x.y&#34; instead of just &#34;1.x.y&#34;.&lt;/p&gt;

&lt;p&gt;Oh, and to get rid of the old history I did&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git tag -d 1.9.0 1.11.0 1.12.0 1.12.1&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git gc --prune&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;h4&gt;Part four: verification&lt;/h4&gt;

&lt;p&gt;I downloaded all the available releases from PyPI:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir -p /tmp/verify&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/verify&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;for v in 1.6.0 1.6.1 1.7.0 1.8.0 1.9.0 1.10.0 1.11.0 1.12.0 1.12.1; do&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;   &lt;span class=&#34;typing&#34;&gt;wget http://pypi.python.org/packages/source/e/eazysvn/eazysvn-$v.tar.gz&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;   &lt;span class=&#34;typing&#34;&gt;tar xvzf eazysvn-$v.tar.gz&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Exported all of my git tags:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir -p /tmp/verify/git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/conv/eazysvn-git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;for v in 1.6.0 1.6.1 1.7.0 1.8.0 1.9.0 1.10.0 1.11.0 1.12.0 1.12.1; do&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;   &lt;span class=&#34;typing&#34;&gt;git archive --format=tar --prefix eazysvn-$v/ v$v | gzip \&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;       &lt;span class=&#34;typing&#34;&gt;&gt; /tmp/verify/git/eazysvn-$v-git.tar.gz&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;done&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/verify/git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;for v in 1.6.0 1.6.1 1.7.0 1.8.0 1.9.0 1.10.0 1.11.0 1.12.0 1.12.1; do&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;   &lt;span class=&#34;typing&#34;&gt;tar xvzf eazysvn-$v-git.tar.gz&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;And compared them:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;diff -ur /tmp/verify /tmp/verify/git&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;I expected to see &#34;Only in dir1: setup.cfg&#34; messages only for things like
&#39;eazysvn.egg-info&#39; or &#39;PKG-INFO&#39;.  Unfortunately this is where actual
differences I mentioned in part one showed up: in README.txt for all trees
starting with release 1.9.0.&lt;/p&gt;

&lt;h4&gt;Part five: rectification&lt;/h4&gt;

&lt;p&gt;I needed to rewrite history again, but I didn&#39;t want to use git
filter-branch this time (I didn&#39;t want to manually tag all the releases
again).  I tried fast-export:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/conv/eazysvn-git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git fast-export --all &gt; ../EXPORT.txt&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;vim ../EXPORT.txt&lt;/span&gt;
search and replace &#39;repo*/*subdirs*&#39; with &#39;repo*/trunk/*subdirs*&#39;
fix up the file size above each change (increment by 6, the length of &#39;trunk/&#39;)
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir /tmp/conv/eazysvn-git2&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/conv/eazysvn-git2&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git init&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git fast-import &amp;lt; ../EXPORT.txt&lt;/span&gt;
succeeds, leaves no working tree; git status shows all files as deleted
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git checkout&lt;/span&gt;
restore working tree
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;gitk --all&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Everything looked about right.&lt;/p&gt;


&lt;h4&gt;Part six: final verification&lt;/h4&gt;

&lt;p&gt;But was it actually right?&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/verify/&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mkdir pypi&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;mv eazysvn-*/ pypi/&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;rm -rf git/*&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/conv/eazysvn-git2&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;for v in 1.6.0 1.6.1 1.7.0 1.8.0 1.9.0 1.10.0 1.11.0 1.12.0 1.12.1; do&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;   &lt;span class=&#34;typing&#34;&gt;git archive --format=tar --prefix eazysvn-$v/ v$v \&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt;       &lt;span class=&#34;typing&#34;&gt;| (cd /tmp/verify/git &amp;&amp; tar -xf - )&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;done&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/verify&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;diff -ur pypi git&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Yes!&lt;/p&gt;

&lt;h4&gt;Part seven: uploading to GitHub&lt;/h4&gt;

&lt;p&gt;It was all plain sailing from here:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;cd /tmp/conv/eazysvn-git2&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git remote add origin git@github.com:mgedmin/eazysvn.git&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git push -u origin master&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;git push --tags&lt;/span&gt;
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;And then there were documentation updates (to point to GitHub instead of the
old Subversion repository), Makefile updates (&lt;tt&gt;make release&lt;/tt&gt; makes sure
my sdist contains everything I have in my repository, because I&#39;ve been bitten
by setuptools magic before), etc.&lt;/p&gt;

&lt;p&gt;I also released &lt;a href=&#34;http://pypi.python.org/pypi/eazysvn&#34;&gt;eazysvn
  1.12.2&lt;/a&gt; to PyPI to test my Makefile changes, and because there were
unreleased changes that should&#39;ve been released a long time ago.&lt;/p&gt;

&lt;p&gt;So that&#39;s it.  Only took me three hours from the point where I found a
Mercurial repository in my inbox.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Converting a gnarly SVN repository to GIT: FAIL.</title>
      <link>https://mg.pov.lt/blog/eazysvn-git-migration.html</link>
      <pubDate>Mon, 20 Feb 2012 00:13:44 +0200</pubDate>
      <author>marius@gedmin.as (Marius Gedminas)</author>
      <guid>https://mg.pov.lt/blog/eazysvn-git-migration.html</guid>
      <description>
&lt;p&gt;&lt;a href=&#34;https://mg.pov.lt/eazysvn/&#34;&gt;eazysvn&lt;/a&gt; lives in a Subversion
repository.  I want to bring it (kicking and screaming) into the 21st century
and put it on Github.&lt;/p&gt;

&lt;p&gt;git-svn is unsuitable for the conversion, because in revision 50 I moved
/ to /trunk and added the traditional /tags and /branches.  With git-svn I
either get one third of the history that ignores everything before the layout
switch, or I get directories named &#39;trunk&#39;, &#39;tags&#39; and &#39;branches&#39;.&lt;/p&gt;

&lt;p&gt;Then I thought maybe hg would be smarter about the conversion, and then I
could use hg-fast-export to convert hg to git.  I enabled the hgsubversion
extension:&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;sudo apt-get install hgsubversion&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;echo &#39;[extensions&#39;] &gt;&gt; ~/.hgrc&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;echo &#39;hgsubversion =&#39; &gt;&gt; ~/.hgrc&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;(blog posts like this are a good reason why hg ought to steal the &#39;git
config --global foo.bar=baz&#39; syntax from git).&lt;/p&gt;

&lt;p&gt;Then I converted the svn repository to Mercurial: &lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;hg clone svn+ssh://fridge/home/mg/svn/eazysvn eazysvn-hg&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;hg log -p &lt;del&gt;confirmed that hg handled the conversion nicely&lt;/del&gt; looked
right-ish at first glance, except the author information was nonsensical.  To
fix that:&lt;/p&gt;

&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;rm -rf eazysvn-hg&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;echo &#39;mg = Marius Gedminas &amp;lt;marius@gedmin.as&amp;gt;&#39; &gt; AUTHORS&lt;/span&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;hg clone svn+ssh://fridge/home/mg/svn/eazysvn eazysvn-hg -A AUTHORS&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Unfortunately, a closer look at hg log now shows that two thirds of the
history is lost: hg ignored everything before the layout restructuring, despite
printing the log messages of those revisions as it went about the conversion.
*sigh*.&lt;/p&gt;

&lt;p&gt;Dear lazyweb, surely svn layout reorganization can&#39;t be such a rare thing
that no tools in existence support it?  What should I try next?&lt;/p&gt;

&lt;p&gt;P.S. I also tried Bazaar, to see what it would do:&lt;/p&gt;
&lt;pre&gt;
&lt;span class=&#34;prompt&#34;&gt;$&lt;/span&gt; &lt;span class=&#34;typing&#34;&gt;bzr branch svn+ssh://fridge/home/mg/svn/eazysvn eazysvn-bzr&lt;/span&gt;
Repository with UUID 4fc293c4-4eed-0310-a01a-b4ad72f90fad at svn+ssh://fridge/home/mg/svn/eazysvn contains fewer revisions than cache. This either means that this repository contains an out of date mirror of another repository (harmless), or that the UUID is being used for two different Subversion repositories (potential repository corruption).
bzr: ERROR: exceptions.KeyError: &#39;missing revision paths for 78&#39;

Traceback (most recent call last):
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/commands.py&#34;, line 946, in exception_to_return_code
    return the_callable(*args, **kwargs)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/commands.py&#34;, line 1150, in run_bzr
    ret = run(*run_argv)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/commands.py&#34;, line 699, in run_argv_aliases
    return self.run(**all_cmd_args)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/commands.py&#34;, line 721, in run
    return self._operation.run_simple(*args, **kwargs)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/cleanup.py&#34;, line 135, in run_simple
    self.cleanups, self.func, *args, **kwargs)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/cleanup.py&#34;, line 165, in _do_with_cleanups
    result = func(*args, **kwargs)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/builtins.py&#34;, line 1263, in run
    from_location)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/bzrdir.py&#34;, line 919, in open_tree_or_branch
    return bzrdir._get_tree_branch()
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/controldir.py&#34;, line 410, in _get_tree_branch
    branch = self.open_branch(name=name)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/remote.py&#34;, line 420, in open_branch
    branch_path = self._determine_relpath(name)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/remote.py&#34;, line 369, in _determine_relpath
    layout = repos.get_layout()
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/repository.py&#34;, line 701, in get_layout
    return self.get_layout_source()[0]
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/repository.py&#34;, line 720, in get_layout_source
    self._find_guessed_layout(self.get_config())
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/repository.py&#34;, line 743, in _find_guessed_layout
    revnum, self._hinted_branch_path)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/layout/guess.py&#34;, line 143, in repository_guess_layout
    return logwalker_guess_layout(repository._log, revnum, branch_path=branch_path)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/layout/guess.py&#34;, line 149, in logwalker_guess_layout
    logwalker.iter_changes(None, revnum, max(0, revnum-GUESS_SAMPLE_SIZE)), revnum, branch_path)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/layout/guess.py&#34;, line 104, in guess_layout_from_history
    for (revpaths, revnum, revprops) in changed_paths:
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/logwalker.py&#34;, line 60, in iter_all_changes
    revpaths = get_revision_paths(revnum)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/logwalker.py&#34;, line 295, in get_revision_paths
    return self.cache.get_revision_paths(revnum)
  File &#34;/usr/lib/python2.7/dist-packages/bzrlib/plugins/svn/cache/tdbcache.py&#34;, line 187, in get_revision_paths
    raise KeyError(&#34;missing revision paths for %d&#34; % revnum)
KeyError: &#39;missing revision paths for 78&#39;

You can report this problem to Bazaar&#39;s developers by running
    apport-bug /var/crash/bzr.1000.2012-02-19T22:12.crash
if a bug-reporting window does not automatically appear.

&lt;/pre&gt;
</description>
    </item>
    
  </channel>
</rss>
