threads / discuss / 42225

Submodule's .git file contains absolute path when created using 'git clone --recursive'

Subject: Submodule's .git file contains absolute path when created using 'git clone --recursive'

## tl;dr

7 messages between May 5, 2016 and Jul 12, 2016.

replies: 6people: 4as markdown or json

Loet Avramson· May 5, 2016, 12:51 UTC · lore
Hi,

According to git-clone man page - running 'git clone --recursive' "...is equivalent to running 'git submodule update --init --recursive' immediately after the clone is finished...", though I found a little difference between the two regarding the submodule's .git file:

1. Running 'git clone' and 'git submodule update --init --recursive' 
separately will create the .git file in each submodule containing a relative 
path to the superproject's .git directory as expected.
2. Running 'git clone --recursive' will create the .git file containing an 
*absolute* path to the superproject's .git directory. (as it was expected 
using git versions 1.7.8 - 1.7.10 as far as I understand)

Not sure if that's a bug but it got stuff behaving really weird in a specific usecase on one of our environments. It would be highly appreciated to update the docs at least.

Thanks.
 -Loet
Junio C Hamano· May 5, 2016, 17:19 UTC · re: Loet Avramson · lore

Re: Submodule's .git file contains absolute path when created using 'git clone --recursive'

Loet Avramson <loet@forter.com> writes:
Show 16 quoted lines
> According to git-clone man page - running 'git clone --recursive' "...is 
> equivalent to running 'git submodule update --init --recursive' immediately 
> after the clone is finished...", though I found a little difference between 
> the two regarding the submodule's .git file:
>
> 1. Running 'git clone' and 'git submodule update --init --recursive' 
> separately will create the .git file in each submodule containing a relative 
> path to the superproject's .git directory as expected.
>
> 2. Running 'git clone --recursive' will create the .git file containing an 
> *absolute* path to the superproject's .git directory. (as it was expected 
> using git versions 1.7.8 - 1.7.10 as far as I understand)
>
> Not sure if that's a bug but it got stuff behaving really weird in a specific 
> usecase on one of our environments. It would be highly appreciated to update 
> the docs at least.

If the documentation already says "equivalent" and does not say "identical", I am not sure if there is anything to update.

In any case, I thought some people are already working to make the result consistently use relative paths (or was it absolute?), so this may soon become a non-issue.

Stefan Beller· May 5, 2016, 17:22 UTC · re: Loet Avramson · lore

Re: Submodule's .git file contains absolute path when created using 'git clone --recursive'

On Thu, May 5, 2016 at 5:51 AM, Loet Avramson <loet@forter.com> wrote:
Show 18 quoted lines
> Hi,
>
> According to git-clone man page - running 'git clone --recursive' "...is
> equivalent to running 'git submodule update --init --recursive' immediately
> after the clone is finished...", though I found a little difference between
> the two regarding the submodule's .git file:
>
> 1. Running 'git clone' and 'git submodule update --init --recursive'
> separately will create the .git file in each submodule containing a relative
> path to the superproject's .git directory as expected.
>
> 2. Running 'git clone --recursive' will create the .git file containing an
> *absolute* path to the superproject's .git directory. (as it was expected
> using git versions 1.7.8 - 1.7.10 as far as I understand)
>
> Not sure if that's a bug but it got stuff behaving really weird in a specific
> usecase on one of our environments. It would be highly appreciated to update
> the docs at least.
Which version of Git are you using?

See[1] for how clone handles submodules. (It's a call to submodule update --init --recursive)

There was a bug with recursive submodules in the 2.7 time frame and that got fixed in [2].

So could you make sure your version of Git contains these fixes?

[1] https://kernel.googlesource.com/pub/scm/git/git/+/master/builtin/clone.c#734 [2] https://kernel.googlesource.com/pub/scm/git/git/+/7307dd898988c79fc687051e783b3cac8488a559 specially https://kernel.googlesource.com/pub/scm/git/git/+/f8eaa0ba98b3bd9cb9035eba184a2d9806d30b27

Show 9 quoted lines
>
> Thanks.
>
>  -Loet
>
> --
> 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
Loet Avramson· May 5, 2016, 19:20 UTC · re: Stefan Beller · lore

Re: Submodule's .git file contains absolute path when created using 'git clone --recursive'

It happened on 2.8.1, also reproducible on 2.8.2. Haven't had the time to dive deeper into the code but my guess is that relative_path() returns different results in those 2 cases or maybe the way git-submodule.sh handles it.

On Thu, May 5, 2016 at 8:22 PM, Stefan Beller <sbeller@google.com> wrote:
Show 47 quoted lines
> On Thu, May 5, 2016 at 5:51 AM, Loet Avramson <loet@forter.com> wrote:
>> Hi,
>>
>> According to git-clone man page - running 'git clone --recursive' "...is
>> equivalent to running 'git submodule update --init --recursive' immediately
>> after the clone is finished...", though I found a little difference between
>> the two regarding the submodule's .git file:
>>
>> 1. Running 'git clone' and 'git submodule update --init --recursive'
>> separately will create the .git file in each submodule containing a relative
>> path to the superproject's .git directory as expected.
>>
>> 2. Running 'git clone --recursive' will create the .git file containing an
>> *absolute* path to the superproject's .git directory. (as it was expected
>> using git versions 1.7.8 - 1.7.10 as far as I understand)
>>
>> Not sure if that's a bug but it got stuff behaving really weird in a specific
>> usecase on one of our environments. It would be highly appreciated to update
>> the docs at least.
>
> Which version of Git are you using?
>
> See[1] for how clone handles submodules. (It's a call to submodule
> update --init --recursive)
>
> There was a bug with recursive submodules in the 2.7 time frame and
> that got fixed in [2].
>
> So could you make sure your version of Git contains these fixes?
>
>
>
> [1] https://kernel.googlesource.com/pub/scm/git/git/+/master/builtin/clone.c#734
> [2] https://kernel.googlesource.com/pub/scm/git/git/+/7307dd898988c79fc687051e783b3cac8488a559
> specially https://kernel.googlesource.com/pub/scm/git/git/+/f8eaa0ba98b3bd9cb9035eba184a2d9806d30b27
>
>
>
>>
>> Thanks.
>>
>>  -Loet
>>
>> --
>> 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
Stefan Beller· May 5, 2016, 19:32 UTC · re: Loet Avramson · lore

Re: Submodule's .git file contains absolute path when created using 'git clone --recursive'

On Thu, May 5, 2016 at 12:20 PM, Loet Avramson <loet@forter.com> wrote:
Show 5 quoted lines
> It happened on 2.8.1, also reproducible on 2.8.2.
> Haven't had the time to dive deeper into the code but my guess is that
> relative_path() returns different results in those 2 cases or maybe
> the way git-submodule.sh handles it.
>

Then you found a new bug, congratulations. ;) Thanks for reporting.

The shell script uses relative_path() only for displaying paths, not for writing them to the .git file.

it really boils down to different environments "git submodule update --init --recursive" is called from (either manually or from `git clone`).

Apart from that there are no immediate bells ringing, are you doing any weird stuff with the file system (soft/hard links) ?

Thanks, Stefan

Ricardo Sánchez-Sáez· Jul 12, 2016, 11:22 UTC · re: Stefan Beller · lore

Re: Submodule's .git file contains absolute path when created using 'git clone --recursive'

Stefan Beller <sbeller <at> google.com> writes:
Show 25 quoted lines
> 
> On Thu, May 5, 2016 at 12:20 PM, Loet Avramson <loet <at> forter.com> wrote:
> > It happened on 2.8.1, also reproducible on 2.8.2.
> > Haven't had the time to dive deeper into the code but my guess is that
> > relative_path() returns different results in those 2 cases or maybe
> > the way git-submodule.sh handles it.
> >
> 
> Then you found a new bug, congratulations. ;)
> Thanks for reporting.
> 
> The shell script uses relative_path() only for displaying paths,
> not for writing them to the .git file.
> 
> it really boils down to different environments
> "git submodule update --init --recursive" is called from
> (either manually or from `git clone`).
> 
> Apart from that there are no immediate bells ringing,
> are you doing any weird stuff with the file system (soft/hard
> links) ?
> 
> Thanks,
> Stefan
> 
Hi,
sorry to awake an old thread. Has this been fixed? In which git version?
It's hitting me on git version  2.7.4 (Apple Git-66) (default git client on
 OS X 10.11.5 (15F34)).
I think all submodule .git files should contain relative paths. Otherwise,
 duplicating or moving the cloned  repository folder breaks the submodules.

Best, Ricardo

Stefan Beller· Jul 12, 2016, 16:46 UTC · re: Ricardo Sánchez-Sáez · lore

Re: Submodule's .git file contains absolute path when created using 'git clone --recursive'

On Tue, Jul 12, 2016 at 4:22 AM, Ricardo Sánchez-Sáez <rsanchez.saez@gmail.com> wrote:

Show 14 quoted lines
> Stefan Beller <sbeller <at> google.com> writes:
>
> Hi,
>
> sorry to awake an old thread. Has this been fixed? In which git version?
> It's hitting me on git version  2.7.4 (Apple Git-66) (default git client on
>  OS X 10.11.5 (15F34)).
>
> I think all submodule .git files should contain relative paths. Otherwise,
>  duplicating or moving the cloned  repository folder breaks the submodules.
>
> Best,
> Ricardo
>
The commit I referenced earlier:

$ git tag --contains f8eaa0ba98b3bd9cb9035eba184a2d9806d30b27 v2.8.3 v2.8.4 v2.9.0 v2.9.0-rc0 v2.9.0-rc1 v2.9.0-rc2 v2.9.1

← back to recent threads