* any way to "re-sync" a bare repository against another bare repository?
@ 2011-09-22 17:22 Chris Friesen
2011-09-22 18:50 ` Michael Witten
0 siblings, 1 reply; 3+ messages in thread
From: Chris Friesen @ 2011-09-22 17:22 UTC (permalink / raw)
To: git
Suppose I have a parent bare repository. I do a "git clone --bare" to
create a child repository, and then clone the child to create a
grandchild repository.
If changes get pushed into the parent repository, is there any way to
cause the child to be updated?
Just a "git fetch <parent>" doesn't seem to help. If I set up parent as
a remote branch I can fetch it, but then it shows all the branches as
"parent/<branch>" rather than updating the child.
I just tried a "git clone --mirror" to create the child and it seems to
allow me to pick up changes in the parent via "git fetch". Is that the
proper way to handle this?
Thanks,
Chris
--
Chris Friesen
Software Developer
GENBAND
chris.friesen@genband.com
www.genband.com
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: any way to "re-sync" a bare repository against another bare repository?
2011-09-22 17:22 any way to "re-sync" a bare repository against another bare repository? Chris Friesen
@ 2011-09-22 18:50 ` Michael Witten
2011-09-22 19:23 ` Chris Friesen
0 siblings, 1 reply; 3+ messages in thread
From: Michael Witten @ 2011-09-22 18:50 UTC (permalink / raw)
To: Chris Friesen; +Cc: git
On Thu, 22 Sep 2011 11:22:37 -0600, Chris Friesen wrote:
> Suppose I have a parent bare repository. I do a "git clone --bare" to
> create a child repository, and then clone the child to create a
> grandchild repository.
Firstly, what exactly is the scenario you are trying to achieve? Perhaps
there is a better way to do what you are trying to do.
> If changes get pushed into the parent repository, is there any way to
> cause the child to be updated?
The documentation answers your question (but badly, as with much of the
documentation); from `git help clone':
--bare
Make a bare GIT repository. That is, instead of creating
<directory> and placing the administrative files in
<directory>/.git, make the <directory> itself the $GIT_DIR.
This obviously implies the -n because there is nowhere to
check out the working tree. Also the branch heads at the
remote are copied directly to corresponding local branch
heads, without mapping them to refs/remotes/origin/. When
this option is used, neither remote-tracking branches nor
the related configuration variables are created.
In particular:
Also the branch heads at the
remote are copied directly to corresponding local branch
heads, without mapping them to refs/remotes/origin/. When
this option is used, neither remote-tracking branches nor
the related configuration variables are created.
In particular:
When
this option is used, neither remote-tracking branches nor
the related configuration variables are created.
Thus, you have to explicitly tell git what you fetched and which
branch heads should be updated.
Consider this:
$ git init parent
$ git clone parent child0
$ git clone --bare parent child1
Now, look at the config file for the child0 repository:
$ cat child0/.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = /path/to/parent
[branch "master"]
remote = origin
merge = refs/heads/master
In particular:
fetch = +refs/heads/*:refs/remotes/origin/*
That is the default `refspec'; when `git fetch' is not explicitly
told on the command line what to fetch and which branch head[s] to
update, then this refspec is used as a default.
Now, look at the config file for the child1 repository:
$ cat child1/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
[remote "origin"]
url = /path/to/parent
In particular, note that a bare repository doesn't include any
such default information for `git fetch'. However, you could be
explicit about it; from within the chidl1 repo:
$ git fetch origin '+refs/heads/*:refs/remotes/origin/*'
> Just a "git fetch <parent>" doesn't seem to help. If I set up parent as
> a remote branch I can fetch it,
Firstly, it doesn't make any sense to say "set up parent as a remote
branch"; what you mean is "set up `<parent>' as a remote with a default
refspec that creates any associated remote-tracking branch heads".
Secondly, by setting up `<parent>' as a remote, you are creating the
missing refspec in your config file:
[remote "<parent>"]
url = /path/to/parent
fetch = +refs/heads/*:refs/remotes/<parent>/*
which is why you get this:
> but then it shows all the branches as "<parent>/<branch>" rather
> than updating the child.
You need a different refspec, namely:
+refs/heads/*:refs/heads/*
So, either be explicit:
git fetch '<parent>' '+refs/heads/*:refs/heads/*'
or update your config:
git config 'remote.<parent>.fetch' '+refs/heads/*:refs/heads/*'
Of course, there is an easier way that does all of this [and more]
for you:
> I just tried a "git clone --mirror" to create the child and it seems to
> allow me to pick up changes in the parent via "git fetch". Is that the
> proper way to handle this?
The documentation answers your question (but badly, as with much of the
documentation); from `git help clone':
--mirror
Set up a mirror of the source repository. This implies
--bare. Compared to --bare, --mirror not only maps local
branches of the source to local branches of the target, it
maps all refs (including remote-tracking branches, notes
etc.) and sets up a refspec configuration such that all
these refs are overwritten by a git remote update in the
target repository.
In particular:
sets up a refspec configuration such that all
these refs are overwritten by a git remote update in the
target repository.
Consider this:
$ git clone --mirror parent child2
$ cat child2/config
[core]
repositoryformatversion = 0
filemode = true
bare = true
[remote "origin"]
fetch = +refs/*:refs/*
mirror = true
url = /path/to/parent
In particular:
fetch = +refs/*:refs/*
That's a very liberal refspec! It basically says that fetch
should mirror everything by default.
Sincerely,
Michael Witten
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: any way to "re-sync" a bare repository against another bare repository?
2011-09-22 18:50 ` Michael Witten
@ 2011-09-22 19:23 ` Chris Friesen
0 siblings, 0 replies; 3+ messages in thread
From: Chris Friesen @ 2011-09-22 19:23 UTC (permalink / raw)
To: Michael Witten; +Cc: git
Thanks for that very thorough response.
The rationale for this is somewhat convoluted...I have a vendor-supplied
build system that expects to be pointed at a bare repository. For
performance reasons I want to have a local bare repo on each build
machine that can be kept in sync with a master repo on a main server.
Chris
On 09/22/2011 12:50 PM, Michael Witten wrote:
> On Thu, 22 Sep 2011 11:22:37 -0600, Chris Friesen wrote:
>
>> Suppose I have a parent bare repository. I do a "git clone --bare" to
>> create a child repository, and then clone the child to create a
>> grandchild repository.
>
> Firstly, what exactly is the scenario you are trying to achieve? Perhaps
> there is a better way to do what you are trying to do.
>
>> If changes get pushed into the parent repository, is there any way to
>> cause the child to be updated?
>
> The documentation answers your question (but badly, as with much of the
> documentation); from `git help clone':
>
> --bare
> Make a bare GIT repository. That is, instead of creating
> <directory> and placing the administrative files in
> <directory>/.git, make the<directory> itself the $GIT_DIR.
> This obviously implies the -n because there is nowhere to
> check out the working tree. Also the branch heads at the
> remote are copied directly to corresponding local branch
> heads, without mapping them to refs/remotes/origin/. When
> this option is used, neither remote-tracking branches nor
> the related configuration variables are created.
>
> In particular:
>
> Also the branch heads at the
> remote are copied directly to corresponding local branch
> heads, without mapping them to refs/remotes/origin/. When
> this option is used, neither remote-tracking branches nor
> the related configuration variables are created.
>
> In particular:
>
> When
> this option is used, neither remote-tracking branches nor
> the related configuration variables are created.
>
> Thus, you have to explicitly tell git what you fetched and which
> branch heads should be updated.
>
> Consider this:
>
> $ git init parent
> $ git clone parent child0
> $ git clone --bare parent child1
>
> Now, look at the config file for the child0 repository:
>
> $ cat child0/.git/config
> [core]
> repositoryformatversion = 0
> filemode = true
> bare = false
> logallrefupdates = true
> [remote "origin"]
> fetch = +refs/heads/*:refs/remotes/origin/*
> url = /path/to/parent
> [branch "master"]
> remote = origin
> merge = refs/heads/master
>
> In particular:
>
> fetch = +refs/heads/*:refs/remotes/origin/*
>
> That is the default `refspec'; when `git fetch' is not explicitly
> told on the command line what to fetch and which branch head[s] to
> update, then this refspec is used as a default.
>
> Now, look at the config file for the child1 repository:
>
> $ cat child1/config
> [core]
> repositoryformatversion = 0
> filemode = true
> bare = true
> [remote "origin"]
> url = /path/to/parent
>
> In particular, note that a bare repository doesn't include any
> such default information for `git fetch'. However, you could be
> explicit about it; from within the chidl1 repo:
>
> $ git fetch origin '+refs/heads/*:refs/remotes/origin/*'
>
>> Just a "git fetch<parent>" doesn't seem to help. If I set up parent as
>> a remote branch I can fetch it,
>
> Firstly, it doesn't make any sense to say "set up parent as a remote
> branch"; what you mean is "set up `<parent>' as a remote with a default
> refspec that creates any associated remote-tracking branch heads".
>
> Secondly, by setting up `<parent>' as a remote, you are creating the
> missing refspec in your config file:
>
> [remote "<parent>"]
> url = /path/to/parent
> fetch = +refs/heads/*:refs/remotes/<parent>/*
>
> which is why you get this:
>
>> but then it shows all the branches as "<parent>/<branch>" rather
>> than updating the child.
>
> You need a different refspec, namely:
>
> +refs/heads/*:refs/heads/*
>
> So, either be explicit:
>
> git fetch '<parent>' '+refs/heads/*:refs/heads/*'
>
> or update your config:
>
> git config 'remote.<parent>.fetch' '+refs/heads/*:refs/heads/*'
>
> Of course, there is an easier way that does all of this [and more]
> for you:
>
>> I just tried a "git clone --mirror" to create the child and it seems to
>> allow me to pick up changes in the parent via "git fetch". Is that the
>> proper way to handle this?
>
> The documentation answers your question (but badly, as with much of the
> documentation); from `git help clone':
>
> --mirror
> Set up a mirror of the source repository. This implies
> --bare. Compared to --bare, --mirror not only maps local
> branches of the source to local branches of the target, it
> maps all refs (including remote-tracking branches, notes
> etc.) and sets up a refspec configuration such that all
> these refs are overwritten by a git remote update in the
> target repository.
>
> In particular:
>
> sets up a refspec configuration such that all
> these refs are overwritten by a git remote update in the
> target repository.
>
> Consider this:
>
> $ git clone --mirror parent child2
> $ cat child2/config
> [core]
> repositoryformatversion = 0
> filemode = true
> bare = true
> [remote "origin"]
> fetch = +refs/*:refs/*
> mirror = true
> url = /path/to/parent
>
> In particular:
>
> fetch = +refs/*:refs/*
>
> That's a very liberal refspec! It basically says that fetch
> should mirror everything by default.
>
> Sincerely,
> Michael Witten
--
Chris Friesen
Software Developer
GENBAND
chris.friesen@genband.com
www.genband.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-09-22 19:24 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-22 17:22 any way to "re-sync" a bare repository against another bare repository? Chris Friesen
2011-09-22 18:50 ` Michael Witten
2011-09-22 19:23 ` Chris Friesen
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).