threads / discuss / 22519

Making custom git-remove-tree command

Subject: Making custom git-remove-tree command

## tl;dr

4 messages between Feb 4, 2010 and Feb 4, 2010.

replies: 3people: 2as markdown or json

Teemu Likonen· Feb 4, 2010, 09:03 UTC · lore

I'm doing a script named git-remove-tree which removes the working tree known to Git. It doesn't touch untracked files; it only deletes directories if they are empty. The script seems to work, but because I'm not very good at Git plumbing and there can be some corner cases which I don't know about, I'd appreciate if more experienced users would have a look. Is the following script safe?

#!/bin/sh # git-remove-tree

is_wt=$(git rev-parse --is-inside-work-tree)
if [ "$is_wt" = false ]; then
	echo "You must run this inside a working tree."
	exit 1
elif [ -z "$is_wt" ]; then
	exit 1
fi
top=$(git rev-parse --show-toplevel)
cd "$top" || {
	echo "Can't go to top-level directory $top"
	exit 1
}
git ls-tree --name-only -r -z HEAD | xargs -0r -- sh -c '
for f in "$@"; do
	rm -f -- "$f"
	d=$(dirname -- "$f")
	[ "$d" = . ] || rmdir -p -- "$d" 2>/dev/null
done' dollar0_argument
echo 'Use "git reset --hard HEAD" to populate the working tree again.'
Johannes Sixt· Feb 4, 2010, 09:55 UTC · re: Teemu Likonen · lore

Re: Making custom git-remove-tree command

Teemu Likonen schrieb:
Show 31 quoted lines
> I'm doing a script named git-remove-tree which removes the working tree
> known to Git. It doesn't touch untracked files; it only deletes
> directories if they are empty. The script seems to work, but because I'm
> not very good at Git plumbing and there can be some corner cases which I
> don't know about, I'd appreciate if more experienced users would have a
> look. Is the following script safe?
> 
> 
> #!/bin/sh
> # git-remove-tree
> 
> is_wt=$(git rev-parse --is-inside-work-tree)
> if [ "$is_wt" = false ]; then
> 	echo "You must run this inside a working tree."
> 	exit 1
> elif [ -z "$is_wt" ]; then
> 	exit 1
> fi
> 
> top=$(git rev-parse --show-toplevel)
> cd "$top" || {
> 	echo "Can't go to top-level directory $top"
> 	exit 1
> }
> 
> git ls-tree --name-only -r -z HEAD | xargs -0r -- sh -c '
> for f in "$@"; do
> 	rm -f -- "$f"
> 	d=$(dirname -- "$f")
> 	[ "$d" = . ] || rmdir -p -- "$d" 2>/dev/null
> done' dollar0_argument
I think you should be able to reduce all of this to just
git read-tree --index-output=/tmp/empty.index -m -u \
	4b825dc642cb6eb9a060e54bf8d69288fbee4904 # empty tree
rm -f /tmp/empty.index
(with the usual caveats about temporary files).
> 
> echo 'Use "git reset --hard HEAD" to populate the working tree again.'
-- Hannes
Teemu Likonen· Feb 4, 2010, 16:32 UTC · re: Johannes Sixt · lore

Re: Making custom git-remove-tree command

* 2010-02-04 10:55 (+0100), Johannes Sixt wrote:
Show 7 quoted lines
> I think you should be able to reduce all of this to just
>
> git read-tree --index-output=/tmp/empty.index -m -u \
> 	4b825dc642cb6eb9a060e54bf8d69288fbee4904 # empty tree
> rm -f /tmp/empty.index
>
> (with the usual caveats about temporary files).

Thanks, it works. It's also _much_ faster than my "git ls-tree" with shell loop thing. It prints ugly error, though:

    fatal: unable to write new index file
Also, it doesn't leave any index output files around.
Johannes Sixt· Feb 4, 2010, 16:43 UTC · re: Teemu Likonen · lore

Re: Making custom git-remove-tree command

Teemu Likonen schrieb:
Show 14 quoted lines
> * 2010-02-04 10:55 (+0100), Johannes Sixt wrote:
> 
>> I think you should be able to reduce all of this to just
>>
>> git read-tree --index-output=/tmp/empty.index -m -u \
>> 	4b825dc642cb6eb9a060e54bf8d69288fbee4904 # empty tree
>> rm -f /tmp/empty.index
>>
>> (with the usual caveats about temporary files).
> 
> Thanks, it works. It's also _much_ faster than my "git ls-tree" with
> shell loop thing. It prints ugly error, though:
> 
>     fatal: unable to write new index file
Then put the temporary index into your git-dir:
   gitdir=$(git rev-parse --git-dir)
   git read-tree --index-ouput="$gitdir/tmpindex" ...
   rm -f "$gitdir/tmpindex"

The purpose of this temporary index is only that your real index is not cleared. If you don't mind that your index is purged as well, then you can just drop the --index-output parameter.

-- Hannes

← back to recent threads