You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.4 KiB
65 lines
2.4 KiB
![]()
19 years ago
|
From: Junio C Hamano <junkio@cox.net>
|
||
|
Subject: Resetting paths
|
||
|
Date: Thu, 09 Feb 2006 20:40:15 -0800
|
||
|
Message-ID: <7vlkwjzv0w.fsf@assigned-by-dhcp.cox.net>
|
||
|
Content-Type: text/plain; charset=us-ascii
|
||
|
Return-path: <git-owner@vger.kernel.org>
|
||
|
|
||
|
While working on "assume unchanged" git series, I found one
|
||
|
thing missing from the current set of tools.
|
||
|
|
||
|
While I worked on parts of the system that deals with the cached
|
||
|
lstat() information, I needed a way to debug that, so I hacked
|
||
|
ls-files -t option to show entries marked as "always matches the
|
||
|
index" with lowercase tag letters. This was primarily debugging
|
||
|
aid hack.
|
||
|
|
||
|
Then I committed the whole thing with "git commit -a" by
|
||
|
mistake. In order to rewind the HEAD to pre-commit state, I can
|
||
|
say "git reset --soft HEAD^", but after doing that, now I want
|
||
|
to unupdate the index so that ls-files.c matches the pre-commit
|
||
|
HEAD.
|
||
|
|
||
|
"git reset --mixed" is a heavy-handed tool for that. It reads
|
||
|
the entier index from the HEAD commit without touching the
|
||
|
working tree, so I would need to add the modified paths back
|
||
|
with "git update-index".
|
||
|
|
||
|
The low-level voodoo to do so for this particular case is this
|
||
|
single liner:
|
||
|
|
||
|
git ls-tree HEAD ls-files.c | git update-index --index-info
|
||
|
|
||
|
Have people found themselves in similar need like this? This
|
||
|
could take different forms.
|
||
|
|
||
|
* you did "git update-index" on a wrong path. This is my
|
||
|
example and the above voodoo is a recipe for recovery.
|
||
|
|
||
|
* you did "git add" on a wrong path and you want to remove it.
|
||
|
This is easier than the above:
|
||
|
|
||
|
git update-index --force-remove path
|
||
|
|
||
|
* you did the above recovery from "git add" on a wrong path,
|
||
|
and you want to add it again. The same voodoo would work in
|
||
|
this case as well.
|
||
|
|
||
|
git ls-tree HEAD path | git update-index --index-info
|
||
|
|
||
|
We could add "git reset path..." to reduce typing for the above,
|
||
|
but I am wondering if it is worth it.
|
||
|
|
||
|
BTW, this shows how "index centric" git is. With other SCM that
|
||
|
has only the last commit and the working tree files, you do not
|
||
|
have to worry any of these things, so it might appear that index
|
||
|
is just a nuisance. But if you do not have any "registry of
|
||
|
paths to be committed", you cannot do a partial commit like what
|
||
|
I did above ("commit changes to all files other than
|
||
|
ls-files.c") without listing all the paths to be committed, or
|
||
|
fall back on CVS style "one path at a time", breaking an atomic
|
||
|
commit, so there is a drawback for not having an index as well.
|
||
|
|
||
|
|
||
|
|