* git-svn: File was not found in commit
@ 2009-01-09 17:19 Morgan Christiansson
2009-01-11 18:36 ` Morgan Christiansson
2009-01-11 21:55 ` Björn Steinbrink
0 siblings, 2 replies; 8+ messages in thread
From: Morgan Christiansson @ 2009-01-09 17:19 UTC (permalink / raw)
To: git
Hi, i'm trying to "git svn fetch" my repository from a local file:///
repo and i'm running into this problem:
$ git svn init -t tags -b branches -T trunk file:///path/to/svn/repo
$ git svn fetch
branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
was not found in commit a643e882c557593f36bb9fd0966490010b9dba61 (r10576)
I found another report that seems to describe the same error:
http://marc.info/?l=git&m=121537767308135&w=2
Investigating the the history it's committed in r10577 and it's looking
for it in r10576, so it seems to be off by one revision number. Exactly
like the other report.
I've tried the latest git version of git-svn.perl and the problem is not
fixed there.
$ svn log file:///path/to/repo -r10576:10577 -v
------------------------------------------------------------------------
r10576 | morgan | 2008-11-28 14:35:53 +0000 (Fri, 28 Nov 2008) | 3 lines
Changed paths:
A /branches/rails/rails/app/controllers/browse_sheetmusic_controller.rb
M /branches/rails/rails/app/controllers/scores_controller.rb
M /branches/rails/rails/app/models/composer.rb
M /branches/rails/rails/app/models/score.rb
M /branches/rails/rails/config/routes.rb
Commit message.
------------------------------------------------------------------------
r10577 | morgan | 2008-11-28 18:31:00 +0000 (Fri, 28 Nov 2008) | 3 lines
Changed paths:
A /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/FETCH_HEAD
M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/config
M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/index
M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/HEAD
M
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/heads/master
# <-- THIS FILE
M
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/remotes/origin/HEAD
M
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/remotes/origin/master
A
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/objects/pack/pack-41ebdff27c581340ac7a71850e2e3a7d1cfea138.idx
A
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/objects/pack/pack-41ebdff27c581340ac7a71850e2e3a7d1cfea138.pack
M
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
M
/branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/remotes/origin/master
A /branches/rails/rails/vendor/plugins/acts_as_xapian/README.textile
M
/branches/rails/rails/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
Switched repo to git://github.com/Overbryd/acts_as_xapian.git
------------------------------------------------------------------------
I did some digging in the perl script and managed to generate this stack
trace, it shows that gs_do_update is called with $rev_a=10576 and
$rev_b=10577, the file is in $rev_b but it complains it's not found in
$rev_a.
SVN::Git::Fetcher::open_file('SVN::Git::Fetcher=HASH(0x25faf38)',
'branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master',
'HASH(0x25fdb00)', 10576, '_p_apr_pool_t=SCALAR(0x24f8978)') called at
/usr/lib/perl5/SVN/Ra.pm line 623
SVN::Ra::Reporter::AUTOLOAD('SVN::Ra::Reporter=ARRAY(0x24f8948)',
'SVN::Pool=REF(0x24f8528)') called at ../git-svn.perl line 4087
Git::SVN::Ra::gs_do_update('Git::SVN::Ra=HASH(0x24beac8)', 10576, 10577,
'Git::SVN=HASH(0x24f7d18)', 'SVN::Git::Fetcher=HASH(0x25faf38)') called
at ../git-svn.perl line 2481
Git::SVN::do_fetch('Git::SVN=HASH(0x24f7d18)', 'HASH(0x24c01f0)', 10577)
called at ../git-svn.perl line 4227
Git::SVN::Ra::gs_fetch_loop_common('Git::SVN::Ra=HASH(0x24beac8)',
10575, 10724, 'ARRAY(0x1da1c20)', 'ARRAY(0x1da1c50)') called at
../git-svn.perl line 1506
Git::SVN::fetch_all('svn', 'HASH(0x21d6440)') called at ../git-svn.perl
line 387
main::cmd_fetch at ../git-svn.perl line 268
eval {...} at ../git-svn.perl line 266
branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
was not found in commit a643e882c557593f36bb9fd0966490010b9dba61
(r10576) at ../git-svn.perl line 3271.
I'm not sure whether this is correct behavior or not and I'm not
familiar with SVN::Ra::Reporter... so some help would be appreciated.
Thanks,
Morgan
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-09 17:19 git-svn: File was not found in commit Morgan Christiansson
@ 2009-01-11 18:36 ` Morgan Christiansson
2009-01-11 21:55 ` Björn Steinbrink
1 sibling, 0 replies; 8+ messages in thread
From: Morgan Christiansson @ 2009-01-11 18:36 UTC (permalink / raw)
To: Morgan Christiansson; +Cc: git
Bump. Can anyone give any pointers or ideas for workarounds on this?
Searching the list archives i have found 2 others reporting similair
problems with git-svn, both which were left unreplied:
http://marc.info/?t=122118776000001&r=1&w=2
http://marc.info/?t=121537770800003&r=1&w=2
I'm stuck at this point - if i can't migrate this repository i cannot
use git for my work.
Morgan Christiansson wrote:
> Hi, i'm trying to "git svn fetch" my repository from a local file:///
> repo and i'm running into this problem:
>
> $ git svn init -t tags -b branches -T trunk file:///path/to/svn/repo
> $ git svn fetch
> branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
> was not found in commit a643e882c557593f36bb9fd0966490010b9dba61 (r10576)
>
>
> I found another report that seems to describe the same error:
> http://marc.info/?l=git&m=121537767308135&w=2
> Investigating the the history it's committed in r10577 and it's looking
> for it in r10576, so it seems to be off by one revision number. Exactly
> like the other report.
> I've tried the latest git version of git-svn.perl and the problem is not
> fixed there.
>
>
> $ svn log file:///path/to/repo -r10576:10577 -v
> ------------------------------------------------------------------------
> r10576 | morgan | 2008-11-28 14:35:53 +0000 (Fri, 28 Nov 2008) | 3 lines
> Changed paths:
> A /branches/rails/rails/app/controllers/browse_sheetmusic_controller.rb
> M /branches/rails/rails/app/controllers/scores_controller.rb
> M /branches/rails/rails/app/models/composer.rb
> M /branches/rails/rails/app/models/score.rb
> M /branches/rails/rails/config/routes.rb
>
> Commit message.
>
> ------------------------------------------------------------------------
> r10577 | morgan | 2008-11-28 18:31:00 +0000 (Fri, 28 Nov 2008) | 3 lines
> Changed paths:
> A /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/FETCH_HEAD
> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/config
> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/index
> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/HEAD
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/heads/master
>
> # <-- THIS FILE
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/remotes/origin/HEAD
>
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/remotes/origin/master
>
> A
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/objects/pack/pack-41ebdff27c581340ac7a71850e2e3a7d1cfea138.idx
>
> A
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/objects/pack/pack-41ebdff27c581340ac7a71850e2e3a7d1cfea138.pack
>
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
>
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/remotes/origin/master
>
> A /branches/rails/rails/vendor/plugins/acts_as_xapian/README.textile
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/lib/acts_as_xapian.rb
>
> Switched repo to git://github.com/Overbryd/acts_as_xapian.git
>
> ------------------------------------------------------------------------
>
>
>
>
> I did some digging in the perl script and managed to generate this stack
> trace, it shows that gs_do_update is called with $rev_a=10576 and
> $rev_b=10577, the file is in $rev_b but it complains it's not found in
> $rev_a.
>
> SVN::Git::Fetcher::open_file('SVN::Git::Fetcher=HASH(0x25faf38)',
> 'branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master',
>
> 'HASH(0x25fdb00)', 10576, '_p_apr_pool_t=SCALAR(0x24f8978)') called at
> /usr/lib/perl5/SVN/Ra.pm line 623
> SVN::Ra::Reporter::AUTOLOAD('SVN::Ra::Reporter=ARRAY(0x24f8948)',
> 'SVN::Pool=REF(0x24f8528)') called at ../git-svn.perl line 4087
> Git::SVN::Ra::gs_do_update('Git::SVN::Ra=HASH(0x24beac8)', 10576, 10577,
> 'Git::SVN=HASH(0x24f7d18)', 'SVN::Git::Fetcher=HASH(0x25faf38)') called
> at ../git-svn.perl line 2481
> Git::SVN::do_fetch('Git::SVN=HASH(0x24f7d18)', 'HASH(0x24c01f0)', 10577)
> called at ../git-svn.perl line 4227
> Git::SVN::Ra::gs_fetch_loop_common('Git::SVN::Ra=HASH(0x24beac8)',
> 10575, 10724, 'ARRAY(0x1da1c20)', 'ARRAY(0x1da1c50)') called at
> ../git-svn.perl line 1506
> Git::SVN::fetch_all('svn', 'HASH(0x21d6440)') called at ../git-svn.perl
> line 387
> main::cmd_fetch at ../git-svn.perl line 268
> eval {...} at ../git-svn.perl line 266
> branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
> was not found in commit a643e882c557593f36bb9fd0966490010b9dba61
> (r10576) at ../git-svn.perl line 3271.
>
>
> I'm not sure whether this is correct behavior or not and I'm not
> familiar with SVN::Ra::Reporter... so some help would be appreciated.
>
> Thanks,
> Morgan
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-09 17:19 git-svn: File was not found in commit Morgan Christiansson
2009-01-11 18:36 ` Morgan Christiansson
@ 2009-01-11 21:55 ` Björn Steinbrink
2009-01-12 0:04 ` Morgan Christiansson
1 sibling, 1 reply; 8+ messages in thread
From: Björn Steinbrink @ 2009-01-11 21:55 UTC (permalink / raw)
To: Morgan Christiansson; +Cc: git
On 2009.01.09 18:19:01 +0100, Morgan Christiansson wrote:
> Hi, i'm trying to "git svn fetch" my repository from a local file:///
> repo and i'm running into this problem:
>
> $ git svn init -t tags -b branches -T trunk file:///path/to/svn/repo
> $ git svn fetch
> branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
> was not found in commit a643e882c557593f36bb9fd0966490010b9dba61 (r10576)
>
>
> I found another report that seems to describe the same error:
> http://marc.info/?l=git&m=121537767308135&w=2
> Investigating the the history it's committed in r10577 and it's looking
> for it in r10576, so it seems to be off by one revision number. Exactly
> like the other report.
> I've tried the latest git version of git-svn.perl and the problem is not
> fixed there.
>
>
> $ svn log file:///path/to/repo -r10576:10577 -v
> ------------------------------------------------------------------------
> r10576 | morgan | 2008-11-28 14:35:53 +0000 (Fri, 28 Nov 2008) | 3 lines
> Changed paths:
> A /branches/rails/rails/app/controllers/browse_sheetmusic_controller.rb
> M /branches/rails/rails/app/controllers/scores_controller.rb
> M /branches/rails/rails/app/models/composer.rb
> M /branches/rails/rails/app/models/score.rb
> M /branches/rails/rails/config/routes.rb
>
> Commit message.
>
> ------------------------------------------------------------------------
> r10577 | morgan | 2008-11-28 18:31:00 +0000 (Fri, 28 Nov 2008) | 3 lines
> Changed paths:
> A /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/FETCH_HEAD
> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/config
> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/index
> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/HEAD
> M
> /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/heads/master
>
>
> # <-- THIS FILE
Unless I totally misread that line, SVN reports that the file was
_modified_, not added. For the file to be modified, it seems reasonable
to expect that it existed in the previous commit.
Is there anything "special" about how that file came into existence in
that branch? Without further knowledge, that looks like a svn bug, but
hey, it's svn, it might do funny stuff on purpose ;-)
Maybe you could provide a small test case/repo?
Björn
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-11 21:55 ` Björn Steinbrink
@ 2009-01-12 0:04 ` Morgan Christiansson
2009-01-12 2:32 ` Eric Wong
0 siblings, 1 reply; 8+ messages in thread
From: Morgan Christiansson @ 2009-01-12 0:04 UTC (permalink / raw)
To: git
Björn Steinbrink wrote:
> On 2009.01.09 18:19:01 +0100, Morgan Christiansson wrote:
>
>> ------------------------------------------------------------------------
>> r10577 | morgan | 2008-11-28 18:31:00 +0000 (Fri, 28 Nov 2008) | 3 lines
>> Changed paths:
>> A /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/FETCH_HEAD
>> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/config
>> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/index
>> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/HEAD
>> M /branches/rails/rails/vendor/plugins/acts_as_xapian/.git/logs/refs/heads/master
>> # -- THIS FILE --
>>
> Unless I totally misread that line, SVN reports that the file was
> _modified_, not added. For the file to be modified, it seems reasonable
> to expect that it existed in the previous commit.
>
> Is there anything "special" about how that file came into existence in
> that branch? Without further knowledge, that looks like a svn bug, but
> hey, it's svn, it might do funny stuff on purpose ;-)
>
> Maybe you could provide a small test case/repo?
>
> Björn
>
Something odd happened when "git svn fetch" was adding r10559 to git:
A rails/vendor/plugins/acts_as_xapian/README.txt
A rails/vendor/plugins/acts_as_xapian/.cvsignore
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/refs/heads/master
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/refs/remotes/origin/HEAD
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/refs/remotes/origin/master
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/HEAD
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/description
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/update
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/post-receive
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/post-update
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/pre-rebase
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/hooks/prepare-commit-msg
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/applypatch-msg
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/pre-applypatch
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/post-commit
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/commit-msg
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/hooks/pre-commit
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/logs/refs/heads/master
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/logs/refs/remotes/origin/HEAD
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/logs/refs/remotes/origin/master
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/logs/HEAD
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/config
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/index
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/objects/pack/pack-570449ffe8ce399eca81f286cf942e51ace03448.pack
Ignoring path
rails/vendor/plugins/acts_as_xapian/.git/objects/pack/pack-570449ffe8ce399eca81f286cf942e51ace03448.idx
Ignoring path rails/vendor/plugins/acts_as_xapian/.git/info/exclude
W: +empty_dir:
branches/rails/rails/vendor/plugins/acts_as_xapian/.git/branches
W: +empty_dir:
branches/rails/rails/vendor/plugins/acts_as_xapian/.git/objects/info
W: +empty_dir:
branches/rails/rails/vendor/plugins/acts_as_xapian/.git/refs/tags
r10559 = 4f33ee36a5d933a62081a76c7788fb46a9e6f0e8 (rails)
The "Ignoring path" message appears to be coming from git which is
refusing to commit the .git directory. Which leads to git-svn being
unaware of the files being ignored and giving an error when it can't
find them.
#The following commands will create a repository that has this problem:
cd ~
rm -rf gittest*
svnadmin create gittest-repo
svn co file:///$HOME/gittest-repo gittest-checkout
cd gittest-checkout
mkdir -p .git
touch .git/file
svn add .git
svn commit -m "Create .git/file"
echo 1 > .git/file
svn commit -m "Modify .git/file"
# The following will try to import the repository, which fails.
cd ~
mkdir gittest
cd gittest
git svn init file:///$HOME/gittest-repo
git svn fetch
# Output:
$ git svn fetch
A .git/file
Ignoring path .git/file
r1 = ccc56451d54315bd253b65c514351e996fbe880e (git-svn)
.git/file was not found in commit
ccc56451d54315bd253b65c514351e996fbe880e (r1)
# Cleanup
rm -rf gittest gittest-repo gittest-checkout
I'm personally fine with these files being ignored by git, but git-svn
needs to be aware that they are not added to the repository.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-12 0:04 ` Morgan Christiansson
@ 2009-01-12 2:32 ` Eric Wong
2009-01-12 5:14 ` Eric Wong
0 siblings, 1 reply; 8+ messages in thread
From: Eric Wong @ 2009-01-12 2:32 UTC (permalink / raw)
To: Morgan Christiansson; +Cc: git
Morgan Christiansson <git@mog.se> wrote:
> The "Ignoring path" message appears to be coming from git which is
> refusing to commit the .git directory. Which leads to git-svn being
> unaware of the files being ignored and giving an error when it can't
> find them.
> I'm personally fine with these files being ignored by git, but git-svn
> needs to be aware that they are not added to the repository.
Hi Morgan,
Can you try the following rough patch and see it it fixes things
for you? Thanks!
>From 559f4b673592f364e9773f2ba65caf09b138521b Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Sun, 11 Jan 2009 18:23:38 -0800
Subject: [PATCH/RFC] git-svn: avoid importing nested repos
Some SVN repositories contain .git repositories within them
(hopefully accidentally checked in). Since git refuses to
check in ".git" repositories, this can be a problem when
fetching updates from SVN.
This seems to repull the entire blob from SVN everytime a user
changes something inside the ".git" directory on the SVN side,
but hopefully this will be a rare case and the SVN users will
correct the error quickly.
The test could probably be expanded to be more thorough...
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
git-svn.perl | 8 +++++
t/t9133-git-svn-nested-git-repo.sh | 61 ++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+), 0 deletions(-)
create mode 100755 t/t9133-git-svn-nested-git-repo.sh
diff --git a/git-svn.perl b/git-svn.perl
index b0e3d7c..d34d967 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -3379,6 +3379,13 @@ sub apply_textdelta {
# (but $base does not,) so dup() it for reading in close_file
open my $dup, '<&', $fh or croak $!;
my $base = $::_repository->temp_acquire('git_blob');
+
+ # skip any .git directories that may have gone into SVN
+ # since update-index refuses to add anything under ".git"
+ if ($fb->{path} =~ m{(?:^|/)\.git(?:/|$)}) {
+ goto apply;
+ }
+
if ($fb->{blob}) {
my ($base_is_link, $size);
@@ -3412,6 +3419,7 @@ sub apply_textdelta {
}
}
seek $base, 0, 0 or croak $!;
+apply:
$fb->{fh} = $fh;
$fb->{base} = $base;
[ SVN::TxDelta::apply($base, $dup, undef, $fb->{path}, $fb->{pool}) ];
diff --git a/t/t9133-git-svn-nested-git-repo.sh b/t/t9133-git-svn-nested-git-repo.sh
new file mode 100755
index 0000000..85402f4
--- /dev/null
+++ b/t/t9133-git-svn-nested-git-repo.sh
@@ -0,0 +1,61 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Eric Wong
+#
+
+test_description='git svn property tests'
+. ./lib-git-svn.sh
+
+test_expect_success 'setup repo with a git repo inside it' '
+ svn co "$svnrepo" s &&
+ (
+ cd s &&
+ git init &&
+ test -f .git/HEAD &&
+ echo a > a &&
+ svn add .git a &&
+ test a = "`sed -ne 1p < a`" &&
+ svn commit -m "create a nested git repo"
+ )
+'
+
+test_expect_success 'clone an SVN repo containing a git repo' '
+ git svn clone "$svnrepo" g
+'
+
+test_expect_success 'SVN-side change outside of .git' '
+ (
+ cd s &&
+ echo b >> a &&
+ svn commit -m "SVN-side change outside of .git"
+ )
+'
+
+test_expect_success 'update git svn-cloned repo' '
+ (
+ cd g &&
+ git svn rebase &&
+ test a = "`sed -ne 1p < a`" &&
+ test b = "`sed -ne 2p < a`"
+ )
+'
+test_expect_success 'SVN-side change inside of .git' '
+ (
+ cd s &&
+ git add a &&
+ git commit -m "add a inside an SVN repo" &&
+ svn add .git &&
+ svn commit -m "SVN-side change inside of .git"
+ )
+'
+
+test_expect_success 'update git svn-cloned repo' '
+ (
+ cd g &&
+ git svn rebase &&
+ grep ^b a &&
+ git log --raw -r
+ )
+'
+
+test_done
--
Eric Wong
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-12 2:32 ` Eric Wong
@ 2009-01-12 5:14 ` Eric Wong
2009-01-12 13:45 ` Morgan Christiansson
0 siblings, 1 reply; 8+ messages in thread
From: Eric Wong @ 2009-01-12 5:14 UTC (permalink / raw)
To: Morgan Christiansson; +Cc: git
Eric Wong <normalperson@yhbt.net> wrote:
> Morgan Christiansson <git@mog.se> wrote:
> > The "Ignoring path" message appears to be coming from git which is
> > refusing to commit the .git directory. Which leads to git-svn being
> > unaware of the files being ignored and giving an error when it can't
> > find them.
>
> > I'm personally fine with these files being ignored by git, but git-svn
> > needs to be aware that they are not added to the repository.
>
> Hi Morgan,
> Can you try the following rough patch and see it it fixes things
> for you? Thanks!
Actually, I think this patch is broken (my quickly put together test
case was insufficient)...
> From 559f4b673592f364e9773f2ba65caf09b138521b Mon Sep 17 00:00:00 2001
> From: Eric Wong <normalperson@yhbt.net>
> Date: Sun, 11 Jan 2009 18:23:38 -0800
> Subject: [PATCH/RFC] git-svn: avoid importing nested repos
>
> Some SVN repositories contain .git repositories within them
> (hopefully accidentally checked in). Since git refuses to
> check in ".git" repositories, this can be a problem when
> fetching updates from SVN.
>
> This seems to repull the entire blob from SVN everytime a user
> changes something inside the ".git" directory on the SVN side,
> but hopefully this will be a rare case and the SVN users will
> correct the error quickly.
>
> The test could probably be expanded to be more thorough...
>
> Signed-off-by: Eric Wong <normalperson@yhbt.net>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-12 5:14 ` Eric Wong
@ 2009-01-12 13:45 ` Morgan Christiansson
2009-01-19 2:41 ` Eric Wong
0 siblings, 1 reply; 8+ messages in thread
From: Morgan Christiansson @ 2009-01-12 13:45 UTC (permalink / raw)
To: Eric Wong; +Cc: git
[-- Attachment #1: Type: text/plain, Size: 1494 bytes --]
Eric Wong wrote:
> Eric Wong <normalperson@yhbt.net> wrote:
>
>> Morgan Christiansson <git@mog.se> wrote:
>>
>>> The "Ignoring path" message appears to be coming from git which is
>>> refusing to commit the .git directory. Which leads to git-svn being
>>> unaware of the files being ignored and giving an error when it can't
>>> find them.
>>>
>>> I'm personally fine with these files being ignored by git, but git-svn
>>> needs to be aware that they are not added to the repository.
>>>
>> Hi Morgan,
>> Can you try the following rough patch and see it it fixes things
>> for you? Thanks!
>>
>
> Actually, I think this patch is broken (my quickly put together test
> case was insufficient)...
>
Yes it was. apply_textdelta() is never called for my repo so it has no
effect.
I've attached an updated and simplified version of the testcase you sent
that correctly triggers the bug i reported.
I'm not a native perl coder though so I don't think I would be able to
provide a clean fix for this. But I've traced through enough of the
program to see that the .git directories should be filtered out as early
as possible to mimick the behaviour of git.
get_log() has a callback as it's last argument which gets called once
per commit, nesting this callback in a new callback which filters the
illegal paths out would work.
Also in gs_do_fetch_loop_common() after get_log() and before
do_git_commit() it's possible to filter them.
Regards,
Morgan
[-- Attachment #2: t9133-git-svn-nested-git-repo.sh --]
[-- Type: application/x-sh, Size: 495 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: git-svn: File was not found in commit
2009-01-12 13:45 ` Morgan Christiansson
@ 2009-01-19 2:41 ` Eric Wong
0 siblings, 0 replies; 8+ messages in thread
From: Eric Wong @ 2009-01-19 2:41 UTC (permalink / raw)
To: Morgan Christiansson; +Cc: git
Morgan Christiansson <git@mog.se> wrote:
> Eric Wong wrote:
>> Eric Wong <normalperson@yhbt.net> wrote:
>>
>>> Morgan Christiansson <git@mog.se> wrote:
>>>
>>>> The "Ignoring path" message appears to be coming from git which is
>>>> refusing to commit the .git directory. Which leads to git-svn being
>>>> unaware of the files being ignored and giving an error when it
>>>> can't find them.
>>>> I'm personally fine with these files being ignored by git,
>>>> but git-svn needs to be aware that they are not added to the
>>>> repository.
>>>>
>>> Hi Morgan,
>>> Can you try the following rough patch and see it it fixes things
>>> for you? Thanks!
>>>
>>
>> Actually, I think this patch is broken (my quickly put together test
>> case was insufficient)...
>>
>
> Yes it was. apply_textdelta() is never called for my repo so it has no
> effect.
>
> I've attached an updated and simplified version of the testcase you sent
> that correctly triggers the bug i reported.
>
> I'm not a native perl coder though so I don't think I would be able to
> provide a clean fix for this. But I've traced through enough of the
> program to see that the .git directories should be filtered out as early
> as possible to mimick the behaviour of git.
Hi Morgan, the following patch should fix your problem.
>From b03a71a660d15d76b63d7d3c5205b896f89f34b5 Mon Sep 17 00:00:00 2001
From: Eric Wong <normalperson@yhbt.net>
Date: Sun, 11 Jan 2009 18:23:38 -0800
Subject: [PATCH] git-svn: avoid importing nested git repos
Some SVN repositories contain git repositories within them
(hopefully accidentally checked in). Since git refuses to track
nested ".git" repositories, this can be a problem when fetching
updates from SVN.
Thanks to Morgan Christiansson for the report and testing.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
---
git-svn.perl | 34 +++++++++++--
t/t9133-git-svn-nested-git-repo.sh | 101 ++++++++++++++++++++++++++++++++++++
2 files changed, 131 insertions(+), 4 deletions(-)
create mode 100755 t/t9133-git-svn-nested-git-repo.sh
diff --git a/git-svn.perl b/git-svn.perl
index 71b8ef4..55c4dfb 100755
--- a/git-svn.perl
+++ b/git-svn.perl
@@ -3291,6 +3291,11 @@ sub _mark_empty_symlinks {
\%ret;
}
+# returns true if a given path is inside a ".git" directory
+sub in_dot_git {
+ $_[0] =~ m{(?:^|/)\.git(?:/|$)};
+}
+
sub set_path_strip {
my ($self, $path) = @_;
$self->{path_strip} = qr/^\Q$path\E(\/|$)/ if length $path;
@@ -3316,6 +3321,7 @@ sub git_path {
sub delete_entry {
my ($self, $path, $rev, $pb) = @_;
+ return undef if in_dot_git($path);
my $gpath = $self->git_path($path);
return undef if ($gpath eq '');
@@ -3343,8 +3349,12 @@ sub delete_entry {
sub open_file {
my ($self, $path, $pb, $rev) = @_;
+ my ($mode, $blob);
+
+ goto out if in_dot_git($path);
+
my $gpath = $self->git_path($path);
- my ($mode, $blob) = (command('ls-tree', $self->{c}, '--', $gpath)
+ ($mode, $blob) = (command('ls-tree', $self->{c}, '--', $gpath)
=~ /^(\d{6}) blob ([a-f\d]{40})\t/);
unless (defined $mode && defined $blob) {
die "$path was not found in commit $self->{c} (r$rev)\n";
@@ -3352,20 +3362,27 @@ sub open_file {
if ($mode eq '100644' && $self->{empty_symlinks}->{$path}) {
$mode = '120000';
}
+out:
{ path => $path, mode_a => $mode, mode_b => $mode, blob => $blob,
pool => SVN::Pool->new, action => 'M' };
}
sub add_file {
my ($self, $path, $pb, $cp_path, $cp_rev) = @_;
- my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#);
- delete $self->{empty}->{$dir};
- { path => $path, mode_a => 100644, mode_b => 100644,
+ my $mode;
+
+ if (!in_dot_git($path)) {
+ my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#);
+ delete $self->{empty}->{$dir};
+ $mode = '100644';
+ }
+ { path => $path, mode_a => $mode, mode_b => $mode,
pool => SVN::Pool->new, action => 'A' };
}
sub add_directory {
my ($self, $path, $cp_path, $cp_rev) = @_;
+ goto out if in_dot_git($path);
my $gpath = $self->git_path($path);
if ($gpath eq '') {
my ($ls, $ctx) = command_output_pipe(qw/ls-tree
@@ -3383,11 +3400,13 @@ sub add_directory {
my ($dir, $file) = ($path =~ m#^(.*?)/?([^/]+)$#);
delete $self->{empty}->{$dir};
$self->{empty}->{$path} = 1;
+out:
{ path => $path };
}
sub change_dir_prop {
my ($self, $db, $prop, $value) = @_;
+ return undef if in_dot_git($db->{path});
$self->{dir_prop}->{$db->{path}} ||= {};
$self->{dir_prop}->{$db->{path}}->{$prop} = $value;
undef;
@@ -3395,6 +3414,7 @@ sub change_dir_prop {
sub absent_directory {
my ($self, $path, $pb) = @_;
+ return undef if in_dot_git($pb->{path});
$self->{absent_dir}->{$pb->{path}} ||= [];
push @{$self->{absent_dir}->{$pb->{path}}}, $path;
undef;
@@ -3402,6 +3422,7 @@ sub absent_directory {
sub absent_file {
my ($self, $path, $pb) = @_;
+ return undef if in_dot_git($pb->{path});
$self->{absent_file}->{$pb->{path}} ||= [];
push @{$self->{absent_file}->{$pb->{path}}}, $path;
undef;
@@ -3409,6 +3430,7 @@ sub absent_file {
sub change_file_prop {
my ($self, $fb, $prop, $value) = @_;
+ return undef if in_dot_git($fb->{path});
if ($prop eq 'svn:executable') {
if ($fb->{mode_b} != 120000) {
$fb->{mode_b} = defined $value ? 100755 : 100644;
@@ -3424,11 +3446,13 @@ sub change_file_prop {
sub apply_textdelta {
my ($self, $fb, $exp) = @_;
+ return undef if (in_dot_git($fb->{path}));
my $fh = $::_repository->temp_acquire('svn_delta');
# $fh gets auto-closed() by SVN::TxDelta::apply(),
# (but $base does not,) so dup() it for reading in close_file
open my $dup, '<&', $fh or croak $!;
my $base = $::_repository->temp_acquire('git_blob');
+
if ($fb->{blob}) {
my ($base_is_link, $size);
@@ -3469,6 +3493,8 @@ sub apply_textdelta {
sub close_file {
my ($self, $fb, $exp) = @_;
+ return undef if (in_dot_git($fb->{path}));
+
my $hash;
my $path = $self->git_path($fb->{path});
if (my $fh = $fb->{fh}) {
diff --git a/t/t9133-git-svn-nested-git-repo.sh b/t/t9133-git-svn-nested-git-repo.sh
new file mode 100755
index 0000000..893f57e
--- /dev/null
+++ b/t/t9133-git-svn-nested-git-repo.sh
@@ -0,0 +1,101 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Eric Wong
+#
+
+test_description='git svn property tests'
+. ./lib-git-svn.sh
+
+test_expect_success 'setup repo with a git repo inside it' '
+ svn co "$svnrepo" s &&
+ (
+ cd s &&
+ git init &&
+ test -f .git/HEAD &&
+ > .git/a &&
+ echo a > a &&
+ svn add .git a &&
+ svn commit -m "create a nested git repo" &&
+ svn up &&
+ echo hi >> .git/a &&
+ svn commit -m "modify .git/a" &&
+ svn up
+ )
+'
+
+test_expect_success 'clone an SVN repo containing a git repo' '
+ git svn clone "$svnrepo" g &&
+ echo a > expect &&
+ test_cmp expect g/a
+'
+
+test_expect_success 'SVN-side change outside of .git' '
+ (
+ cd s &&
+ echo b >> a &&
+ svn commit -m "SVN-side change outside of .git" &&
+ svn up &&
+ svn log -v | fgrep "SVN-side change outside of .git"
+ )
+'
+
+test_expect_success 'update git svn-cloned repo' '
+ (
+ cd g &&
+ git svn rebase &&
+ echo a > expect &&
+ echo b >> expect &&
+ test_cmp a expect &&
+ rm expect
+ )
+'
+
+test_expect_success 'SVN-side change inside of .git' '
+ (
+ cd s &&
+ git add a &&
+ git commit -m "add a inside an SVN repo" &&
+ git log &&
+ svn add --force .git &&
+ svn commit -m "SVN-side change inside of .git" &&
+ svn up &&
+ svn log -v | fgrep "SVN-side change inside of .git"
+ )
+'
+
+test_expect_success 'update git svn-cloned repo' '
+ (
+ cd g &&
+ git svn rebase &&
+ echo a > expect &&
+ echo b >> expect &&
+ test_cmp a expect &&
+ rm expect
+ )
+'
+
+test_expect_success 'SVN-side change in and out of .git' '
+ (
+ cd s &&
+ echo c >> a &&
+ git add a &&
+ git commit -m "add a inside an SVN repo" &&
+ svn commit -m "SVN-side change in and out of .git" &&
+ svn up &&
+ svn log -v | fgrep "SVN-side change in and out of .git"
+ )
+'
+
+test_expect_success 'update git svn-cloned repo again' '
+ (
+ cd g &&
+ git svn rebase &&
+ echo a > expect &&
+ echo b >> expect &&
+ echo c >> expect &&
+ test_cmp a expect &&
+ rm expect
+ )
+'
+
+test_done
--
Eric Wong
^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-01-19 2:43 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-09 17:19 git-svn: File was not found in commit Morgan Christiansson
2009-01-11 18:36 ` Morgan Christiansson
2009-01-11 21:55 ` Björn Steinbrink
2009-01-12 0:04 ` Morgan Christiansson
2009-01-12 2:32 ` Eric Wong
2009-01-12 5:14 ` Eric Wong
2009-01-12 13:45 ` Morgan Christiansson
2009-01-19 2:41 ` Eric Wong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).