From: Chris Webb <chris@arachsys.com>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>, git@vger.kernel.org
Subject: Re: Editing the root commit
Date: Fri, 22 Jun 2012 21:50:27 +0100 [thread overview]
Message-ID: <20120622205026.GI32205@arachsys.com> (raw)
In-Reply-To: <20120620194824.GA32228@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
> I think the only thing you can do is make a fake sentinel commit (with
> an empty tree) to put in HEAD, and then remove the sentinel immediately
> after the first commit is put in place (making sure not to include it in
> the first commit's parent list). Yuck.
If I do this:
diff --git a/path.c b/path.c
index 6f2aa69..1b3b6f3 100644
--- a/path.c
+++ b/path.c
@@ -169,8 +169,9 @@ int validate_headref(const char *path)
int fd;
ssize_t len;
+ /* Allow HEAD to be entirely missing for detached orphan state */
if (lstat(path, &st) < 0)
- return -1;
+ return errno == ENOENT ? 0 : -1;
/* Make sure it is a "refs/.." symlink */
if (S_ISLNK(st.st_mode)) {
to thwart the sanity check, I can do 'rm $GIT_DIR/HEAD' to put my HEAD into a
state where it is both detached and unborn, i.e. so that my next commit will
result in a detached HEAD pointing at a root commit.
Surprisingly, this check appears to be the only thing disallowing such a state,
and the result behaves as sanely as a normal git-checkout --orphan <branch>
does! Using a detached unborn HEAD like this would avoid any need for sentinel
commits or the like in generalising rebase: we'd just do
git rm -rf .
rm -f $GIT_DIR/index $GIT_DIR/HEAD
instead of git checkout $onto, and be away replaying the commits or executing
the instruction sheet as normal.
If I prepared a proper patch series with docs and tests, would allowing this be
acceptable? I don't want to work on it if there's an intentional design
decision to explicitly disallow it. However, apart from just rebase and
rebase--interactive, I suspect other scripts which operate on history will be
more easily generalised to work on history right up to the root commit if such
a state were allowed.
PS Whilst experimenting, I also noticed a (presumably unintentional) behaviour:
$ git init .
Initialized empty Git repository in /tmp/foo/.git/
$ git checkout --detach
$ touch bar
$ git add bar
$ git commit -m test
[(null) (root-commit) 17b5bf9] test
0 files changed
create mode 100644 bar
$ ls .git/refs/heads/
(null)
$
Here we've created a branch with the strange name '(null)' instead of actually
detaching, or refusing to detach because we're on an unborn branch.
Assuming this is a bug, I'll cook up a patch to fix it either way, either by
entering a detached unborn state if we're allowing that, or to refuse to detach
if we're not allowing that state.
Best wishes,
Chris.
next prev parent reply other threads:[~2012-06-22 20:50 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-19 9:16 Editing the root commit Chris Webb
2012-06-19 10:09 ` Junio C Hamano
2012-06-19 11:17 ` Chris Webb
2012-06-20 9:32 ` Chris Webb
2012-06-20 18:25 ` Junio C Hamano
2012-06-20 19:29 ` Jeff King
2012-06-20 19:39 ` Chris Webb
2012-06-20 19:48 ` Jeff King
2012-06-22 20:50 ` Chris Webb [this message]
2012-06-22 21:35 ` Junio C Hamano
2012-06-22 22:02 ` Chris Webb
2012-06-22 22:26 ` Chris Webb
2012-06-22 22:50 ` Junio C Hamano
2012-06-23 7:20 ` Chris Webb
2012-06-26 15:04 ` git-commit bug (was Re: Editing the root commit) Chris Webb
2012-06-26 15:06 ` [PATCH] git-checkout: disallow --detach on unborn branch Chris Webb
2012-06-26 18:08 ` git-commit bug Junio C Hamano
2012-06-26 13:33 ` Editing the root commit Chris Webb
2012-06-26 13:36 ` [PATCH 1/2] rebase -i: support --root without --onto Chris Webb
2012-06-26 13:36 ` [PATCH 2/2] Add tests for rebase -i " Chris Webb
2012-06-26 19:20 ` [PATCH 1/2] rebase -i: support " Junio C Hamano
2012-06-26 19:38 ` Chris Webb
2012-06-26 20:05 ` Junio C Hamano
2012-06-26 20:11 ` Chris Webb
2012-06-26 21:24 ` Junio C Hamano
2012-06-26 21:27 ` Chris Webb
2012-06-20 19:35 ` Editing the root commit Chris Webb
2012-06-25 17:22 ` Martin von Zweigbergk
2012-06-19 11:50 ` jaseem abid
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120622205026.GI32205@arachsys.com \
--to=chris@arachsys.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.