[libvirt] Switch from CVS to GIT is done

Jim Meyering jim at meyering.net
Mon Jul 6 13:36:29 UTC 2009


Daniel Veillard wrote:
>   Thanks to Jim Meyering we now have a new git repository, I deprecated the
> CVS repository, it's read only, you should still be able to keep it
> around to make patches for a few weeks if needed.
>   The new repo is at:
>     http://libvirt.org/git/?p=libvirt.git;a=summary

To create that new repository, I rewrote the git repository from
et.redhat.com to correct a few minor problems.
In case anyone is interested, here are the details.

---------------------------------------
Some commits had incomplete names.
Run this to see all 64 commits:

  $ git log --pretty=format:%h:%an|grep -v ' '

Here's a summary:

  $ git log --pretty=format:%an|grep -v ' '|sort|uniq -c
      1 aliguori
     13 clalance
      3 crobinso
      8 danms
      5 dlesko
     23 meyering
     11 sakaia

============================
Note that rewriting changes nearly all SHA1 values, so
any reference to an SHA1 in a commit log should be updated
to point to the new SHA1.  There are a few:

$ git log|grep -E '\b[0-9a-f]{7,40}\b'|grep -v '^commit'
    This regressed via commit 4c3f3b4d.
    [043d702f] "use virAsprintf instead of asprintf" introducted
    The 'getVer' fix introducted in d88d459d [Allow remote://hostname/
    Bug introduced in 895d0fdf5bef358fafb91c672609190b3088097b.

====================================================
Run the following long(!) command to rewrite the "master" branch,
preserving tags (but not signed ones), fixing bogus author names and
preserving SHA1 references like the above:

git filter-branch -d $TMPDIR/.git-rewrite \
 --tag-name-filter cat \
 --env-filter '

case $GIT_AUTHOR_NAME in
  agx) n="Guido Günther" e="agx at sigxcpu.org" ;;
  aliguori) n="Anthony Liguori" e="aliguori at us.ibm.com" ;;
  clalance) n="Chris Lalancette" e="clalance at redhat.com" ;;
  crobinso) n="Cole Robinson" e="crobinso at redhat.com" ;;
  danms) n="Dan Smith" e="danms at us.ibm.com" ;;
  dlesko) n="David L. Leskovec" e="dlesko at linux.vnet.ibm.com" ;;
  meyering) n="Jim Meyering" e="meyering at redhat.com" ;;
  sakaia) n="Atsushi SAKAI" e="sakaia at jp.fujitsu.com" ;;
  *) n=$GIT_AUTHOR_NAME e=$GIT_AUTHOR_EMAIL ;;
esac

export GIT_AUTHOR_EMAIL=$e GIT_AUTHOR_NAME=$n
export GIT_COMMITTER_EMAIL=$e GIT_COMMITTER_NAME=$n

' --msg-filter '

cat > t.msg
ref=$(perl -ne "/\b([0-9a-f]{7,40})\b/ and print \$1" t.msg)
test -n "$ref" && sha=$(git rev-parse $ref) &&
  {
    len=$(printf $ref|wc -c)
    new_sha=$(map $sha)
    short_sha=$(printf %.${len}s $new_sha)
    perl -pi -e "s/$ref/$short_sha/" t.msg
  }
cat t.msg

' master

I tested it on this tiny repository:
  git init -q; : > j; git add j; git ci -q --author='meyering <meyering>' -m. -a
  c=$(git log --pretty=%h)
  echo a > j; git ci -q -m "fix bug in $c" -a

====================================================

The above preserves regular tags, but not the signed ones.
Reapply the signed vM.N.O tags:

for i in $(git tag -l 'LIBVIRT_*'); do
  v=$(echo $i|sed 's/LIBVIRT_/v/;s/_/./g')
  echo $v
  git tag -f -s -m$v $v $i
done

====================================================

With the above changes, we've bloated the repository by ~50%,
increasing its size from 22M to 34M.

Remove the cruft:

  git for-each-ref --format="%(refname)" refs/original/ \
    | xargs -n 1 git update-ref -d
  git reflog expire --expire=now --all
  git gc --prune=now

And that brings it back down to 23M.
Run this function

git-repo-compress()
{
  local d=$1
  du -sh "$d"; start=$(date); /usr/bin/time \
    git --git-dir=$d repack -afd --window=250 --depth=250
  echo started $start; date; du -sh "$d"
}

to compress a few remaining bits.
Final size: 21M.

Push to libvirt.org:

  git push libvirt.org:/git/libvirt.git master:master
  git push --tags libvirt.org:/git/libvirt.git

====================================================

After I'd pushed all of the above, Dan Berrange noticed
that the new signed tags were out of order and had all
been created today.

Back-date the signed tags so that each has the same date as its
unsigned counterpart:

for i in $(git tag -l 'LIBVIRT_*'); do
  v=$(echo $i|sed 's/LIBVIRT_/v/;s/_/./g')
  date=$(git log --pretty=%ci -1 $i)
  echo $v
  GIT_COMMITTER_DATE="$date" git tag -f -s -m$v $v $i
done

# And push (now we need the -f option):
git push -f --tags libvirt.org:/git/libvirt.git




More information about the libvir-list mailing list