* when is a remote a branch? @ 2006-11-12 15:50 Anand Kumria 2006-11-12 16:11 ` Jakub Narebski 0 siblings, 1 reply; 7+ messages in thread From: Anand Kumria @ 2006-11-12 15:50 UTC (permalink / raw) To: git Hi, I generally tend to use cogito -- it does all the heavy lifting, like recovering from interrupted fetchs (usually) for me. One thing I haven't really gotten my head around is the difference between a branch and a remote. git-branch knows of 'remotes' (via the -r parameter) and these to be unrelated to what cogito thinks remotes are (it seems to look for things in .git/refs/head/<name> and then a corresponding .git/branches/<name>/ which it then declares a remote). Yet, git-init-db creates both .git/remotes and .git/branches What is the difference between the two. From my (naïve) perspective the two tools (git and cogito) regarded them very differently. Any explanation, or pointer to some documentation, would be helpful. Thanks, Anand ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when is a remote a branch? 2006-11-12 15:50 when is a remote a branch? Anand Kumria @ 2006-11-12 16:11 ` Jakub Narebski 2006-11-12 16:36 ` Petr Baudis 0 siblings, 1 reply; 7+ messages in thread From: Jakub Narebski @ 2006-11-12 16:11 UTC (permalink / raw) To: git Anand Kumria wrote: > I generally tend to use cogito -- it does all the heavy lifting, like > recovering from interrupted fetchs (usually) for me. One thing I haven't > really gotten my head around is the difference between a branch and a > remote. > > git-branch knows of 'remotes' (via the -r parameter) and these to be > unrelated to what cogito thinks remotes are (it seems to look for things > in .git/refs/head/<name> and then a corresponding .git/branches/<name>/ > which it then declares a remote). Not about 'remotes', but about 'remote [read-only] branches', i.e. refs not from .refs/heads/, but from .refs/remotes/<remotename>/ > Yet, git-init-db creates both .git/remotes and .git/branches > > What is the difference between the two. From my (na?ve) perspective the > two tools (git and cogito) regarded them very differently. > > Any explanation, or pointer to some documentation, would be helpful. Read Documentation/repository-layout.txt (ot it's HTML version, either locally ot at www.kernel.org). branches:: A slightly deprecated way to store shorthands to be used to specify URL to `git fetch`, `git pull` and `git push` commands is to store a file in `branches/'name'` and give 'name' to these commands in place of 'repository' argument. You can store only one branch to fetch per shorthand. I'm not sure about where it is stored which branch to download, and how to name this branch locally. remotes:: Stores shorthands to be used to give URL and default refnames to interact with remote repository to `git fetch`, `git pull` and `git push` commands. From Documentation/urls.txt In addition to the above, as a short-hand, the name of a file in `$GIT_DIR/remotes` directory can be given; the named file should be in the following format: URL: one of the above URL format Push: <refspec> Pull: <refspec> Currently there is yet another way, by using config file: (also from Documentation/urls.txt): Or, equivalently, in the `$GIT_DIR/config` (note the use of `fetch` instead of `Pull:`): [remote "<remote>"] url = <url> push = <refspec> fetch = <refspec> where <refspec> is defined in Documentation/fetch-pull-param.txt <refspec>:: The canonical format of a <refspec> parameter is `+?<src>:<dst>`; that is, an optional plus `+`, followed by the source ref, followed by a colon `:`, followed by the destination ref. (or, simply, in git-pull(1), which includes those files, with exception of repository layout document). -- Jakub Narebski Warsaw, Poland ShadeHawk on #git ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when is a remote a branch? 2006-11-12 16:11 ` Jakub Narebski @ 2006-11-12 16:36 ` Petr Baudis 2006-11-12 17:31 ` Jakub Narebski 0 siblings, 1 reply; 7+ messages in thread From: Petr Baudis @ 2006-11-12 16:36 UTC (permalink / raw) To: Jakub Narebski; +Cc: git On Sun, Nov 12, 2006 at 05:11:41PM CET, Jakub Narebski wrote: > Read Documentation/repository-layout.txt (ot it's HTML version, either > locally ot at www.kernel.org). > > branches:: > A slightly deprecated way to store shorthands to be used > to specify URL to `git fetch`, `git pull` and `git push` > commands is to store a file in `branches/'name'` and > give 'name' to these commands in place of 'repository' > argument. > > You can store only one branch to fetch per shorthand. I'm not sure about > where it is stored which branch to download, and how to name this branch > locally. I think the above is quite confusing description. This really is not about any "shorthands" at all, but just about branches (how the name implies, after all). Git and Cogito share the same models of branches. These branches are 'heads' with commit pointers stored in refs/heads/, etc. The branches/ directory says that some branches do not correspond to local development (and should never be used for that) but instead they correspond to a particular branch in some remote repository. Such branches are called "REMOTE BRANCHES". So it's "if branch X has corresponding .git/branch/X file, it's not a local branch but instead a REMOTE BRANCH corresponding to the URL stored in that file". That simple. The URL is address of the repository plus optionally a '#branchname' if the branch name in the remote repository should not default to remote HEAD or master. In addition, Git (not Cogito at this point) supports a completely different and unrelated abstraction called REMOTES. They don't have anything to do with branches. Instead, a REMOTE represents a repository URL and a set of local/remote branch pairs to handle on pulls and pushes; it has no other obvious mapping to branches and branches can be even shared between various REMOTES etc. (this is changing lately with the refs/remotes/ hierarchy, but I think that's still not in wide use). -- Petr "Pasky" Baudis Stuff: http://pasky.or.cz/ #!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when is a remote a branch? 2006-11-12 16:36 ` Petr Baudis @ 2006-11-12 17:31 ` Jakub Narebski 2006-11-14 20:28 ` Petr Baudis 0 siblings, 1 reply; 7+ messages in thread From: Jakub Narebski @ 2006-11-12 17:31 UTC (permalink / raw) To: Petr Baudis, Anand Kumria; +Cc: git Petr "Pasky" Baudis wrote: > On Sun, Nov 12, 2006 at 05:11:41PM CET, Jakub Narebski wrote: >> Read Documentation/repository-layout.txt (ot it's HTML version, either >> locally ot at www.kernel.org). >> >> branches:: >> A slightly deprecated way to store shorthands to be used >> to specify URL to `git fetch`, `git pull` and `git push` >> commands is to store a file in `branches/'name'` and >> give 'name' to these commands in place of 'repository' >> argument. >> >> You can store only one branch to fetch per shorthand. I'm not sure about >> where it is stored which branch to download, and how to name this branch >> locally. > > I think the above is quite confusing description. This really is not > about any "shorthands" at all, but just about branches (how the name > implies, after all). Well, it is a shorthand in a way that you can just use "git fetch" or "cg fetch" to fetch correct branch without need for URL. But I agree that the description (although of deprecated feature) could be better. > Git and Cogito share the same models of branches. These branches are > 'heads' with commit pointers stored in refs/heads/, etc. Not exactly. "Live" branches (i.e. branches you can commit to) are head refs stored in refs/heads/. But in repository cloned with git-clone --use-separate-remotes tracking heads (tracking branches) would be at refs/remotes/<remotename>/. You can fetch to such a ref, but you can't checkout it, nor commit to it. > The branches/ > directory says that some branches do not correspond to local development > (and should never be used for that) but instead they correspond to a Does that _should_ is enforced in Cogito? Is it enforced in Git? > particular branch in some remote repository. Such branches are called > "REMOTE BRANCHES". I'd rather call them "tracking branches", at least in git. So if there is branch 'localbranch' in refs/heads/ (?), and there is corresponding branches file branches/localbranch, which contains a single URL git://host.domain/path/to/repository#remotebranch it is AFAICU equivalent to having some remotes file, named e.g. 'repo', with the following contents: URL: git://host.domain/path/to/repository Pull: remotebranch:localbranch Push: remotebranch:localbranch or equivalent entry in git config. > So it's "if branch X has corresponding .git/branch/X file, it's not a > local branch but instead a REMOTE BRANCH corresponding to the URL stored > in that file". That simple. The URL is address of the repository plus > optionally a '#branchname' if the branch name in the remote repository > should not default to remote HEAD or master. The whole concept of branches file (and marking some branches as "remote" branches) is IMHO from the times where there were most common to have one live branch per repository, and we fetched and pushed single branches. This simple picture changed with more widespread use of multiple heads, and with the introduction of tags (I think). > In addition, Git (not Cogito at this point) supports a completely > different and unrelated abstraction called REMOTES. They don't have > anything to do with branches. Instead, a REMOTE represents a repository > URL and a set of local/remote branch pairs to handle on pulls and > pushes; it has no other obvious mapping to branches and branches can be > even shared between various REMOTES etc. (this is changing lately with > the refs/remotes/ hierarchy, but I think that's still not in wide use). Remote is usually a repository. It is single URL (although it would be nice to be able to specify alternate URLs for the same repository, or for different mirrors of the same repository) representing repository to fetch from/to push to, together with branches we want to fetch (which parts of DAG we want to fetch), and local names of those branches, following fetched contents. By the way, with introduction of branches and remotes in config file, you can say: [branch "localbranch"] remote = someremote [remote "someremote"] fetch = remotebranch:localbranch push = remotebranch:localbranch and that would be equivalent to example branches file from the beginning of this email. -- Jakub Narebski ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when is a remote a branch? 2006-11-12 17:31 ` Jakub Narebski @ 2006-11-14 20:28 ` Petr Baudis 2006-11-14 20:36 ` Jakub Narebski 0 siblings, 1 reply; 7+ messages in thread From: Petr Baudis @ 2006-11-14 20:28 UTC (permalink / raw) To: Jakub Narebski; +Cc: Anand Kumria, git On Sun, Nov 12, 2006 at 06:31:18PM CET, Jakub Narebski wrote: > Petr "Pasky" Baudis wrote: > > Git and Cogito share the same models of branches. These branches are > > 'heads' with commit pointers stored in refs/heads/, etc. > > Not exactly. "Live" branches (i.e. branches you can commit to) are head > refs stored in refs/heads/. But in repository cloned with git-clone > --use-separate-remotes tracking heads (tracking branches) would be at > refs/remotes/<remotename>/. You can fetch to such a ref, but you can't > checkout it, nor commit to it. That was meant to be the "etc". ;-)) > > The branches/ > > directory says that some branches do not correspond to local development > > (and should never be used for that) but instead they correspond to a > Does that _should_ is enforced in Cogito? Is it enforced in Git? Yes (you cannot switch to it). No (AFAIK). > > particular branch in some remote repository. Such branches are called > > "REMOTE BRANCHES". > > I'd rather call them "tracking branches", at least in git. So if there > is branch 'localbranch' in refs/heads/ (?), and there is corresponding > branches file branches/localbranch, which contains a single URL > git://host.domain/path/to/repository#remotebranch > it is AFAICU equivalent to having some remotes file, named e.g. 'repo', > with the following contents: > URL: git://host.domain/path/to/repository > Pull: remotebranch:localbranch > Push: remotebranch:localbranch > or equivalent entry in git config. Yes, except that the remote must be named 'localbranch'. > > So it's "if branch X has corresponding .git/branch/X file, it's not a > > local branch but instead a REMOTE BRANCH corresponding to the URL stored > > in that file". That simple. The URL is address of the repository plus > > optionally a '#branchname' if the branch name in the remote repository > > should not default to remote HEAD or master. > > The whole concept of branches file (and marking some branches as "remote" > branches) is IMHO from the times where there were most common to have one > live branch per repository, and we fetched and pushed single branches. > This simple picture changed with more widespread use of multiple heads, > and with the introduction of tags (I think). I completely agree. The original remotes implementation was messy, but with refs/remotes/ it's simple again. Only lack of time (or laziness) on my side is why Cogito didn't move to this yet. > By the way, with introduction of branches and remotes in config file, > you can say: > [branch "localbranch"] > remote = someremote > [remote "someremote"] > fetch = remotebranch:localbranch > push = remotebranch:localbranch > > and that would be equivalent to example branches file from the beginning > of this email. According to the documentation, this is not really useful since this just tells what should git fetch default to when on branch "localbranch". But "localbranch" is still just a branch representing a state in a remote repository, so you should never be _on_ it in a sane setup, but instead on a different branch which tracks it. -- Petr "Pasky" Baudis Stuff: http://pasky.or.cz/ #!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when is a remote a branch? 2006-11-14 20:28 ` Petr Baudis @ 2006-11-14 20:36 ` Jakub Narebski 2006-11-14 20:44 ` Petr Baudis 0 siblings, 1 reply; 7+ messages in thread From: Jakub Narebski @ 2006-11-14 20:36 UTC (permalink / raw) To: Petr Baudis; +Cc: Anand Kumria, git Petr "Pasky" Baudis wrote: > On Sun, Nov 12, 2006 at 06:31:18PM CET, Jakub Narebski wrote: >> >> By the way, with introduction of branches and remotes in config file, >> you can say: >> [branch "localbranch"] >> remote = someremote >> [remote "someremote"] >> fetch = remotebranch:localbranch >> push = remotebranch:localbranch >> >> and that would be equivalent to example branches file from >> the beginning of this email. > > According to the documentation, this is not really useful since this > just tells what should git fetch default to when on branch > "localbranch". But "localbranch" is still just a branch representing a > state in a remote repository, so you should never be _on_ it in a sane > setup, but instead on a different branch which tracks it. Oh. Can you "git fetch Localbranch" _without_ repository named "localbranch" in above case? -- Jakub Narebski ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: when is a remote a branch? 2006-11-14 20:36 ` Jakub Narebski @ 2006-11-14 20:44 ` Petr Baudis 0 siblings, 0 replies; 7+ messages in thread From: Petr Baudis @ 2006-11-14 20:44 UTC (permalink / raw) To: Jakub Narebski; +Cc: Anand Kumria, git On Tue, Nov 14, 2006 at 09:36:16PM CET, Jakub Narebski wrote: > Petr "Pasky" Baudis wrote: > > On Sun, Nov 12, 2006 at 06:31:18PM CET, Jakub Narebski wrote: > >> > >> By the way, with introduction of branches and remotes in config file, > >> you can say: > >> [branch "localbranch"] > >> remote = someremote > >> [remote "someremote"] > >> fetch = remotebranch:localbranch > >> push = remotebranch:localbranch > >> > >> and that would be equivalent to example branches file from > >> the beginning of this email. > > > > According to the documentation, this is not really useful since this > > just tells what should git fetch default to when on branch > > "localbranch". But "localbranch" is still just a branch representing a > > state in a remote repository, so you should never be _on_ it in a sane > > setup, but instead on a different branch which tracks it. > > Oh. Can you "git fetch Localbranch" _without_ repository named > "localbranch" in above case? So that it would be equivalent to git fetch someremote, and also fetch any other branches associated with that remote? I would hope not. :-) -- Petr "Pasky" Baudis Stuff: http://pasky.or.cz/ #!/bin/perl -sp0777i<X+d*lMLa^*lN%0]dsXx++lMlN/dsM0<j]dsj $/=unpack('H*',$_);$_=`echo 16dio\U$k"SK$/SM$n\EsN0p[lN*1 ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2006-11-14 20:44 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2006-11-12 15:50 when is a remote a branch? Anand Kumria 2006-11-12 16:11 ` Jakub Narebski 2006-11-12 16:36 ` Petr Baudis 2006-11-12 17:31 ` Jakub Narebski 2006-11-14 20:28 ` Petr Baudis 2006-11-14 20:36 ` Jakub Narebski 2006-11-14 20:44 ` Petr Baudis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox