1. 18 4月, 2014 1 次提交
  2. 01 4月, 2014 2 次提交
  3. 23 1月, 2014 1 次提交
  4. 08 3月, 2013 2 次提交
  5. 10 2月, 2013 1 次提交
  6. 24 1月, 2013 1 次提交
  7. 06 10月, 2012 3 次提交
  8. 11 8月, 2012 1 次提交
    • P
      git svn: reset invalidates the memoized mergeinfo caches · 61b472ed
      Peter Baumann 提交于
      Since v1.7.0-rc2~11 (git-svn: persistent memoization, 2010-01-30),
      git-svn has maintained some private per-repository caches in
      .git/svn/.caches to avoid refetching and recalculating some
      mergeinfo-related information with every 'git svn fetch'.
      
      This memoization can cause problems, e.g consider the following case:
      
      SVN repo:
      
        ... - a - b - c - m  <- trunk
                \        /
                  d  -  e    <- branch1
      
      The Git import of the above repo is at commit 'a' and doesn't know about
      the branch1. In case of an 'git svn rebase', only the trunk of the
      SVN repo is imported. During the creation of the git commit 'm', git svn
      uses the svn:mergeinfo property and tries to find the corresponding git
      commit 'e' to create 'm' with 'c' and 'e' as parents. But git svn rebase
      only imports the current branch so commit 'e' is not imported.
      Therefore git svn fails to create commit 'm' as a merge commit, because one
      of its parents is not known to git. The imported history looks like this:
      
        ... - a - b - c - m  <- trunk
      
      A later 'git svn fetch' to import all branches can't rewrite the commit 'm'
      to add 'e' as a parent and to make it a real git merge commit, because it
      was already imported.
      
      That's why the imported history misses the merge and looks like this:
      
        ... - a - b - c - m  <- trunk
                \
                  d  -  e    <- branch1
      
      Right now the only known workaround for importing 'm' as a merge is to
      force reimporting 'm' again from SVN, e.g. via
      
        $ git svn reset --revision $(git find-rev $c)
        $ git svn fetch
      
      Sadly, this is where the behavior has regressed: git svn reset doesn't
      invalidate the old mergeinfo cache, which is no longer valid for the
      reimport, which leads to 'm' beeing imprted with only 'c' as parent.
      
      As solution to this problem, this commit invalidates the mergeinfo cache
      to force correct recalculation of the parents.
      
      During development of this patch, several ways for invalidating the cache
      where considered. One of them is to use Memoize::flush_cache, which will
      call the CLEAR method on the underlying Memoize persistency implementation.
      Sadly, neither Memoize::Storable nor the newer Memoize::YAML module
      introduced in 68f532f4 could optionally be used implement the
      CLEAR method, so this is not an option.
      
      Reseting the internal hash used to store the memoized values has the same
      problem, because it calls the non-existing CLEAR method of the
      underlying persistency layer, too.
      
      Considering this and taking into account the different implementations
      of the memoization modules, where Memoize::Storable is not in our control,
      implementing the missing CLEAR method is not an option, at least not if
      Memoize::Storable is still used.
      
      Therefore the easiest solution to clear the cache is to delete the files
      on disk in 'git svn reset'. Normally, deleting the files behind the back
      of the memoization module would be problematic, because the in-memory
      representation would still exist and contain wrong data. Fortunately, the
      memoization is active in memory only for a small portion of the code.
      Invalidating the cache by deleting the files on disk if it isn't active
      should be safe.
      Signed-off-by: NPeter Baumann <waste.manager@gmx.de>
      Signed-off-by: NSteven Walter <stevenrwalter@gmail.com>
      Signed-off-by: NEric Wong <normalperson@yhbt.net>
      61b472ed
  9. 03 8月, 2012 11 次提交
  10. 28 7月, 2012 3 次提交