Re: Extending "extended SHA1" syntax to traverse through gitlinks?
From: Josh Triplett <josh@joshtriplett.org>
Date: 2016-08-23 06:56:35
On Mon, Aug 22, 2016 at 08:39:19PM +0200, Jakub Narębski wrote:
W dniu 21.08.2016 o 16:26, Josh Triplett pisze:quoted
On Sun, Aug 21, 2016 at 03:46:36PM +0200, Jakub Narębski wrote:quoted
W dniu 21.08.2016 o 00:50, Josh Triplett pisze:quoted
Currently, if you have a branch "somebranch" that contains a gitlink "somecommit", you can write "somebranch:somecommit" to refer to the commit, just like a tree or blob. ("man git-rev-parse" defines this syntax in the "SPECIFYING REVISIONS" section.) You can use this anywhere you can use a committish, including "git show somebranch:somecommit", "git log somebranch:somecommit..anotherbranch", or even "git format-patch -1 somebranch:somecommit". However, you cannot traverse *through* the gitlink to look at files inside its own tree, or to look at other commits relative to that commit. For instance, "somebranch:somecommit:somefile" and "somebranch:somecommit~3" do not work.Note that there is the same problem traversing through trees: while 'git cat-file -p HEAD:subdir/file' works, the 'HEAD:subdir:file' doesn't: $ git cat-file -p HEAD:subdir:file fatal: Not a valid object name HEAD:subdir:fileInteresting point; if extending this syntax anyway, any treeish ought to work, not just a committish.Actually, because you can use simply "HEAD:subdir/file" I'd rather it didn't work (no two ways of access), unless we can get it for free.
Agreed. I suspect we'd get it for free if we introduced a syntax for traversing through commits (by allowing that syntax to work with any treeish), but if not, I certainly don't see any value in adding a second syntax for accessing tree contents.
quoted
quoted
quoted
I'd love to have a syntax that allows traversing through the gitlink to other files or commits. Ideally, I'd suggest the syntax above, as a natural extension of the existing extended syntax.And with the above manual resolving, you can see the problem with implementing it: the git-cat-file (in submodule) and git-rev-parse (in supermodule) are across repository boundary.Only if the gitlink points to a commit that doesn't exist in the same repository. A gitlink can point to a commit you already have.The idea of submodules is that tree object in superproject includes link to commit of subproject (so called gitlink). Tree object is in superproject repository, while gitlinked commit is in submodule repository. True, with modern Git the submodule repository is embedded in .git area of superproject, with '.git' in submodule being gitling file, but by design those objects are in different repositories, in different object databases.
git-submodule handles them that way by default, yes. But a gitlink doesn't inherently have to point to a separate repository, and even a submodule could point to an object available in the same repository (perhaps via another ref). git-series creates such gitlinks, for instance.
quoted
quoted
Also the problem with proposed syntax is that is not very visible. But perhaps it is all right. Maybe :/ as separator would be better, or using parentheses or braces?It seems as visible as the standard commit:path syntax; the second colon seems just as visible as the first. :/ already has a different meaning (text search), so that would introduce inconsistency.Actually ":/" has a special meaning only if it is at beginning:
True, but it seems inconsistent to have :/ mean search if at the beginning, or traversal if not.
But perhaps '//' would be better.
That does seem unambiguous, and it can't conflict with an existing file.
Does it seem reasonable to allow that for the initial commit as well
('committish//file', as well as 'commit//gitlink//file')?
Also, while that handles traversal into the tree contained in the
gitlinked commit, what about navigating by commit (using '~' and '^',
for instance)? Does it seem reasonable to allow those as well, perhaps
only if you use // to reach the gitlink? For instance,
'commit//gitlink~3', or 'commit//gitlink^{tree}'?