Hi,
On Wed, 1 Feb 2006, Junio C Hamano wrote:
Johannes Schindelin [off-list ref] writes:
quoted
quoted
quoted
Worse, you cannot pull from older servers into shallow repos.
"have X" means different thing if you do not have matching
grafts information, so I suspect that is fundamentally
unsolvable.
If the shallow-capable client could realize that the server is not
shallow-capable *and* the local repo is shallow, and refuse to operate
(unless called with "-f", in which case the result may or may not be a
broken repo, which has to be fixed up manually by copying
over ORIG_HEAD to HEAD).
"If ... refuse to operate" then?
Just skip the "If". I'll start to enclose all emails I write in
<tired>..</tired> blocks.
quoted
Of course, the client has to know that the local repo is shallow, which it
must not determine by looking at the grafts file.
Sorry, I fail to understand this requirement. Why is it "it must not"?
See below.
quoted
If you introduce a different "have X" -- like "have-no-parent X" -- and
teach git-rev-list that "~A" means "traverse the tree of A, but not A's
parents", you'd basically have everything you need, right?
If you have such a modified rev-list, yes. I was having doubts
about keeping an obvious correctness guarantee when doing such
"rev-list ~A".
I think it would be trivial: just resolve ~A to the tree A points to:
-- snip --
[PATCH] rev-list: Support "~treeish"
Now, "git rev-list --objects ~some_rev" traverses just the tree of
some_rev.
Signed-off-by: Johannes Schindelin <redacted>
---
rev-list.c | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
43267e65c9ad933ad1a49005c4b61c23adaec372
diff --git a/rev-list.c b/rev-list.c
index 8012762..a196110 100644
--- a/rev-list.c
+++ b/rev-list.c
@@ -720,6 +720,24 @@ static void handle_one_commit(struct com
commit_list_insert(com, lst);
}
+static void handle_tree(const unsigned char *sha1)
+{
+ struct object *object;
+
+ object = parse_object(sha1);
+ if (!object)
+ die("bad object %s", sha1_to_hex(sha1));
+
+ if (object->type == tree_type)
+ add_pending_object(object, "");
+ else if (object->type == commit_type) {
+ struct commit *commit = (struct commit *)object;
+ if (parse_commit(commit) < 0)
+ die("unable to parse commit %s", sha1_to_hex(sha1));
+ add_pending_object(&(commit->tree->object), "");
+ }
+}
+
/* for_each_ref() callback does not allow user data -- Yuck. */
static struct commit_list **global_lst;
@@ -865,6 +883,11 @@ int main(int argc, const char **argv)
flags = UNINTERESTING;
arg++;
limited = 1;
+ } else if (*arg == '~') {
+ if (get_sha1(arg + 1, sha1) < 0)
+ die("cannot get '%s'", arg);
+ handle_tree(sha1);
+ continue;
}
if (get_sha1(arg, sha1) < 0) {
struct stat st;--
1.1.4.g9bd9d-dirty
-- snap --
> > Yes, I agree. But again, the local repo has to know which grafts were
> > introduced by making the repo shallow.
>
> I am not sure I understand. grafts are grafts are grafts.
Exactly. And grafts are grafts are not necessarily cutoffs.
Now, is it possible that a fetch does something unintended, when there are
grafts which are not cutoffs? I don't know yet, but I think so.
Ciao,
Dscho