git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC] Removing deleted files after checkout
@ 2005-08-23 16:21 Carl Baldwin
  2005-08-23 19:43 ` Daniel Barkalow
  0 siblings, 1 reply; 10+ messages in thread
From: Carl Baldwin @ 2005-08-23 16:21 UTC (permalink / raw)
  To: git

[-- Attachment #1: Type: text/plain, Size: 2000 bytes --]

Hello,

I recently started using git to revision control the source for my
web-page.  I wrote a post-update hook to checkout the files when I push
to the 'live' repository.

In this particular context I decided that it was important to me to remove
deleted files after checking out the new HEAD.  I accomplished this by running
git-ls-files before and after the checkout.

Is there a better way?  Could there be some way built into git to easily
find out what files dissappear when replacing the current index with one
from a new tree?  Is there already?  The behavior of git should NOT
change to delete these files but I would argue that some way should
exist to query what files disappeared if removing them is desired.

Here is some code that I wrote for this.  It feels a bit hackish to me but I
couldn't think of anything better.  Comments and criticism are welcome.

#!/bin/sh

# HEAD changed so checkout the new HEAD deleted any files that should no longer
# be around.
oldlist=$(tempfile)
newlist=$(tempfile)
removedlist=$(tempfile)

git-ls-files | sort -r > $oldlist
git-checkout-script -f
git-ls-files | sort -r > $newlist

diff -u $oldlist $newlist |
  tail -n +4 |
  sed -n 's/^-//p' > $removedlist

# Remove each file
cat $removedlist | xargs -rl rm -f
# Remove the directories if empty
cat $removedlist | xargs -rl dirname | xargs -rl rmdir -p --ignore-fail-on-non-empty

rm -f $oldlist $newlist $removedlist

# --- snip ---

If you are interested I attached the full post-update hook script that I
actually use to do this.  Again, comments are welcome.

Thanks,
Carl

-- 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Carl Baldwin                        Systems VLSI Laboratory
 Hewlett Packard Company
 MS 88                               work: 970 898-1523
 3404 E. Harmony Rd.                 work: Carl.N.Baldwin@hp.com
 Fort Collins, CO 80525              home: Carl@ecBaldwin.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

[-- Attachment #2: post-update --]
[-- Type: text/plain, Size: 827 bytes --]

#!/bin/sh

export PATH=/usr/local/bin:/usr/bin:/bin

# cd to the root of the project directory (assume one dir up from GIT_DIR)
cd $GIT_DIR/..
unset GIT_DIR

# Set up some temporary files and a trap to delete them
oldlist=$(tempfile)
newlist=$(tempfile)
removelist=$(tempfile)
trap "rm -f $oldlist $newlist $removelist" 0 1 2 3 15

# Get list of files from the current index
git-ls-files | sort -r > $oldlist

# Checkout the index to the working directory
git-checkout-script -f

# Get list of files from the current (new) index
git-ls-files | sort -r > $newlist

# Use diff to determine which files to remove from the working copy
diff -u $oldlist $newlist |
  tail -n +4 |
  sed -n 's/^-//p' > $removelist

cat $removelist | xargs -rl rm -f
cat $removelist | xargs -rl dirname | xargs -rl rmdir -p --ignore-fail-on-non-empty

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 16:21 [RFC] Removing deleted files after checkout Carl Baldwin
@ 2005-08-23 19:43 ` Daniel Barkalow
  2005-08-23 20:50   ` Carl Baldwin
  0 siblings, 1 reply; 10+ messages in thread
From: Daniel Barkalow @ 2005-08-23 19:43 UTC (permalink / raw)
  To: Carl Baldwin; +Cc: git

On Tue, 23 Aug 2005, Carl Baldwin wrote:

> Hello,
>
> I recently started using git to revision control the source for my
> web-page.  I wrote a post-update hook to checkout the files when I push
> to the 'live' repository.
>
> In this particular context I decided that it was important to me to remove
> deleted files after checking out the new HEAD.  I accomplished this by running
> git-ls-files before and after the checkout.
>
> Is there a better way?  Could there be some way built into git to easily
> find out what files dissappear when replacing the current index with one
> from a new tree?  Is there already?  The behavior of git should NOT
> change to delete these files but I would argue that some way should
> exist to query what files disappeared if removing them is desired.

If you don't use -f, git-checkout-script removes deleted files. Using -f
tells it to ignore the old index, which means that it can't tell the
difference between removed files and files that weren't tracked at all.

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 19:43 ` Daniel Barkalow
@ 2005-08-23 20:50   ` Carl Baldwin
  2005-08-23 21:27     ` Daniel Barkalow
  0 siblings, 1 reply; 10+ messages in thread
From: Carl Baldwin @ 2005-08-23 20:50 UTC (permalink / raw)
  To: Daniel Barkalow; +Cc: Carl Baldwin, git

On Tue, Aug 23, 2005 at 03:43:56PM -0400, Daniel Barkalow wrote:
> On Tue, 23 Aug 2005, Carl Baldwin wrote:
> 
> > Hello,
> >
> > I recently started using git to revision control the source for my
> > web-page.  I wrote a post-update hook to checkout the files when I push
> > to the 'live' repository.
> >
> > In this particular context I decided that it was important to me to remove
> > deleted files after checking out the new HEAD.  I accomplished this by running
> > git-ls-files before and after the checkout.
> >
> > Is there a better way?  Could there be some way built into git to easily
> > find out what files dissappear when replacing the current index with one
> > from a new tree?  Is there already?  The behavior of git should NOT
> > change to delete these files but I would argue that some way should
> > exist to query what files disappeared if removing them is desired.
> 
> If you don't use -f, git-checkout-script removes deleted files. Using -f
> tells it to ignore the old index, which means that it can't tell the
> difference between removed files and files that weren't tracked at all.

Maybe I'm doing something wrong.  This does not happen for me.

I tried a simple test with git v0.99.4...

cd
mkdir test-git && cd test-git/
echo testing | cg-init
echo contents > file
git-add-script file
git-commit-script -m 'testing'
cd ..
cg-clone test-git/.git/ test-git2
cd test-git2
cg-rm file
git-commit-script -m 'testing'
ls
cg-push
cd ../test-git
git-checkout-script
ls
git-status-script

At this point, I want 'file' to be gone.  It is, however, still there.
That is the situation that my code was meant to handle.  Maybe you were
thinking of something different?  Maybe there is new code since 0.99.4?

Now, I think it would be wrong for git-checkout-script to actually
remove files unless an option were given to do so.  So, the behavior
that I observe is correct in my opinion.  I'm looking for a way to find
out what files should be deleted if that is desired.

Thanks,
Carl

> 	-Daniel
> *This .sig left intentionally blank*
> 

-- 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Carl Baldwin                        Systems VLSI Laboratory
 Hewlett Packard Company
 MS 88                               work: 970 898-1523
 3404 E. Harmony Rd.                 work: Carl.N.Baldwin@hp.com
 Fort Collins, CO 80525              home: Carl@ecBaldwin.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 20:50   ` Carl Baldwin
@ 2005-08-23 21:27     ` Daniel Barkalow
  2005-08-23 21:40       ` Carl Baldwin
  2005-08-23 21:54       ` Junio C Hamano
  0 siblings, 2 replies; 10+ messages in thread
From: Daniel Barkalow @ 2005-08-23 21:27 UTC (permalink / raw)
  To: Carl Baldwin; +Cc: git

On Tue, 23 Aug 2005, Carl Baldwin wrote:

> On Tue, Aug 23, 2005 at 03:43:56PM -0400, Daniel Barkalow wrote:
> > On Tue, 23 Aug 2005, Carl Baldwin wrote:
> >
> > > Hello,
> > >
> > > I recently started using git to revision control the source for my
> > > web-page.  I wrote a post-update hook to checkout the files when I push
> > > to the 'live' repository.
> > >
> > > In this particular context I decided that it was important to me to remove
> > > deleted files after checking out the new HEAD.  I accomplished this by running
> > > git-ls-files before and after the checkout.
> > >
> > > Is there a better way?  Could there be some way built into git to easily
> > > find out what files dissappear when replacing the current index with one
> > > from a new tree?  Is there already?  The behavior of git should NOT
> > > change to delete these files but I would argue that some way should
> > > exist to query what files disappeared if removing them is desired.
> >
> > If you don't use -f, git-checkout-script removes deleted files. Using -f
> > tells it to ignore the old index, which means that it can't tell the
> > difference between removed files and files that weren't tracked at all.
>
> Maybe I'm doing something wrong.  This does not happen for me.
>
> I tried a simple test with git v0.99.4...
>
> cd
> mkdir test-git && cd test-git/
> echo testing | cg-init
> echo contents > file
> git-add-script file
> git-commit-script -m 'testing'

[point 1]

> cd ..
> cg-clone test-git/.git/ test-git2
> cd test-git2
> cg-rm file
> git-commit-script -m 'testing'
> ls

> cg-push
> cd ../test-git
> git-checkout-script

Ah, okay. I think "push" and "checkout" don't play that well together;
"push" changes the ref, which "checkout" uses to determine what it expects
for the old contents, and then it's confused.

What you probably actually want is:

cd ../test-git
git pull ../test-git2

which will correctly identify before and after, and remove any files that
were removed.

Alternatively, you could do, at point 1:

cp .git/refs/master .git/refs/deployed
git checkout deployed

Then, after the push and cd:

git checkout master
cp .git/refs/master .git/refs/deployed
git checkout deployed

because checkout does remove files if you switch from a branch with them
(e.g., deployed) to one without them (master, after the push).

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 21:27     ` Daniel Barkalow
@ 2005-08-23 21:40       ` Carl Baldwin
  2005-08-23 22:12         ` Daniel Barkalow
  2005-08-23 21:54       ` Junio C Hamano
  1 sibling, 1 reply; 10+ messages in thread
From: Carl Baldwin @ 2005-08-23 21:40 UTC (permalink / raw)
  To: Daniel Barkalow; +Cc: Carl Baldwin, git

On Tue, Aug 23, 2005 at 05:27:12PM -0400, Daniel Barkalow wrote:
> On Tue, 23 Aug 2005, Carl Baldwin wrote:
> 
> > On Tue, Aug 23, 2005 at 03:43:56PM -0400, Daniel Barkalow wrote:
> > > On Tue, 23 Aug 2005, Carl Baldwin wrote:
> > >
> > > > Hello,
> > > >
> > > > I recently started using git to revision control the source for my
> > > > web-page.  I wrote a post-update hook to checkout the files when I push
> > > > to the 'live' repository.
> > > >
> > > > In this particular context I decided that it was important to me to remove
> > > > deleted files after checking out the new HEAD.  I accomplished this by running
> > > > git-ls-files before and after the checkout.
> > > >
> > > > Is there a better way?  Could there be some way built into git to easily
> > > > find out what files dissappear when replacing the current index with one
> > > > from a new tree?  Is there already?  The behavior of git should NOT
> > > > change to delete these files but I would argue that some way should
> > > > exist to query what files disappeared if removing them is desired.
> > >
> > > If you don't use -f, git-checkout-script removes deleted files. Using -f
> > > tells it to ignore the old index, which means that it can't tell the
> > > difference between removed files and files that weren't tracked at all.
> >
> > Maybe I'm doing something wrong.  This does not happen for me.
> >
> > I tried a simple test with git v0.99.4...
> >
> > cd
> > mkdir test-git && cd test-git/
> > echo testing | cg-init
> > echo contents > file
> > git-add-script file
> > git-commit-script -m 'testing'
> 
> [point 1]
> 
> > cd ..
> > cg-clone test-git/.git/ test-git2
> > cd test-git2
> > cg-rm file
> > git-commit-script -m 'testing'
> > ls
> 
> > cg-push
> > cd ../test-git
> > git-checkout-script
> 
> Ah, okay. I think "push" and "checkout" don't play that well together;
> "push" changes the ref, which "checkout" uses to determine what it expects
> for the old contents, and then it's confused.
> 
> What you probably actually want is:
> 
> cd ../test-git
> git pull ../test-git2

The point is to push and use a post-update hook to do the checkout.  So,
this won't be possible.

> which will correctly identify before and after, and remove any files that
> were removed.
> 
> Alternatively, you could do, at point 1:
> 
> cp .git/refs/master .git/refs/deployed
> git checkout deployed

How to get a post-update hook to do this?  I suppose an update script
could set this up for the post-update to later use.

Thanks,
Carl

-- 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Carl Baldwin                        Systems VLSI Laboratory
 Hewlett Packard Company
 MS 88                               work: 970 898-1523
 3404 E. Harmony Rd.                 work: Carl.N.Baldwin@hp.com
 Fort Collins, CO 80525              home: Carl@ecBaldwin.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 21:27     ` Daniel Barkalow
  2005-08-23 21:40       ` Carl Baldwin
@ 2005-08-23 21:54       ` Junio C Hamano
  2005-08-23 22:21         ` Carl Baldwin
  1 sibling, 1 reply; 10+ messages in thread
From: Junio C Hamano @ 2005-08-23 21:54 UTC (permalink / raw)
  To: Carl Baldwin; +Cc: git, Daniel Barkalow

Daniel Barkalow <barkalow@iabervon.org> writes:

>> > If you don't use -f, git-checkout-script removes deleted files. Using -f
>> > tells it to ignore the old index, which means that it can't tell the
>> > difference between removed files and files that weren't tracked at all.

Yes and no.  "git checkout" assumes that the index file and the
working tree somewhat resembles what is in .git/HEAD commit.
Since push operation updates .git/HEAD commit without touching
the index file, that assumption does not hold.

The update hook gets old commit name and new commit name, so you
should be able to do (untested):

    git-read-tree -m -u $old_commit $new_commit

there, of course after making sure that you had old_commit (the
first time push happens to a new ref you would not have that one).

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 21:40       ` Carl Baldwin
@ 2005-08-23 22:12         ` Daniel Barkalow
  0 siblings, 0 replies; 10+ messages in thread
From: Daniel Barkalow @ 2005-08-23 22:12 UTC (permalink / raw)
  To: Carl Baldwin; +Cc: git

On Tue, 23 Aug 2005, Carl Baldwin wrote:

> The point is to push and use a post-update hook to do the checkout.  So,
> this won't be possible.

You could have the remote repository be something like
"~/git/website.git", and have a hook which does: "cd ~/www; git pull
~/git/website.git/". That is, have three things: the directory where you
work on stuff, the central storage location, and the area that the web
server serves, and have the storage location automatically update the web
server area. That's what I do with my website section that's still in CVS,
and the general concept is good (and means that the "real" repository
isn't somewhere the web server is poking around).

> > which will correctly identify before and after, and remove any files that
> > were removed.
> >
> > Alternatively, you could do, at point 1:
> >
> > cp .git/refs/master .git/refs/deployed
> > git checkout deployed
>
> How to get a post-update hook to do this?  I suppose an update script
> could set this up for the post-update to later use.

If you have "deployed" checked out, and you push to "master" in the same
repository, having the hook do "git resolve deployed master auto-update"
should work.

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 21:54       ` Junio C Hamano
@ 2005-08-23 22:21         ` Carl Baldwin
  2005-08-23 22:34           ` Daniel Barkalow
  0 siblings, 1 reply; 10+ messages in thread
From: Carl Baldwin @ 2005-08-23 22:21 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Carl Baldwin, git, Daniel Barkalow

Ok, the following is what I came up with based on your response.  This
is .git/hooks/update.  It mostly works in my situation.  See below for
my discussion on what didn't work.

#!/bin/sh

export PATH=/usr/local/bin:/usr/bin:/bin

# cd to the root of the project directory (assume one dir up from GIT_DIR)
cd $GIT_DIR/..
unset GIT_DIR

if expr "$2" : '0*$' >/dev/null; then
    git-read-tree --reset $3 &&
        git-checkout-cache -q -f -u -a
else
    git-read-tree -m -u $2 $3
fi

exit 0

# --- snip ---

The thing that this doesn't do is remove empty directories when the last
file is deleted.  I once expressed the opinion in a previous thread that
directories should be added and removed explicitly in git.  (Thus
allowing an empty directory to be added).  If this were to happen then
this case would get handled correctly.  However, if git stays with the
status quo then I think that git-read-tree -u should be changed to
remove the empty directory.  This would make it consistent.

What do you think?  Ideas?

Carl

On Tue, Aug 23, 2005 at 02:54:30PM -0700, Junio C Hamano wrote:
> Daniel Barkalow <barkalow@iabervon.org> writes:
> 
> >> > If you don't use -f, git-checkout-script removes deleted files. Using -f
> >> > tells it to ignore the old index, which means that it can't tell the
> >> > difference between removed files and files that weren't tracked at all.
> 
> Yes and no.  "git checkout" assumes that the index file and the
> working tree somewhat resembles what is in .git/HEAD commit.
> Since push operation updates .git/HEAD commit without touching
> the index file, that assumption does not hold.
> 
> The update hook gets old commit name and new commit name, so you
> should be able to do (untested):
> 
>     git-read-tree -m -u $old_commit $new_commit
> 
> there, of course after making sure that you had old_commit (the
> first time push happens to a new ref you would not have that one).
> 

-- 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 Carl Baldwin                        Systems VLSI Laboratory
 Hewlett Packard Company
 MS 88                               work: 970 898-1523
 3404 E. Harmony Rd.                 work: Carl.N.Baldwin@hp.com
 Fort Collins, CO 80525              home: Carl@ecBaldwin.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 22:21         ` Carl Baldwin
@ 2005-08-23 22:34           ` Daniel Barkalow
  2005-08-24  0:02             ` Junio C Hamano
  0 siblings, 1 reply; 10+ messages in thread
From: Daniel Barkalow @ 2005-08-23 22:34 UTC (permalink / raw)
  To: Carl Baldwin; +Cc: Junio C Hamano, git

On Tue, 23 Aug 2005, Carl Baldwin wrote:

> The thing that this doesn't do is remove empty directories when the last
> file is deleted.  I once expressed the opinion in a previous thread that
> directories should be added and removed explicitly in git.  (Thus
> allowing an empty directory to be added).  If this were to happen then
> this case would get handled correctly.  However, if git stays with the
> status quo then I think that git-read-tree -u should be changed to
> remove the empty directory.  This would make it consistent.

I think that git-read-tree -u ought to remove a directory if it removes
the last file (or directory) in it.

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [RFC] Removing deleted files after checkout
  2005-08-23 22:34           ` Daniel Barkalow
@ 2005-08-24  0:02             ` Junio C Hamano
  0 siblings, 0 replies; 10+ messages in thread
From: Junio C Hamano @ 2005-08-24  0:02 UTC (permalink / raw)
  To: Daniel Barkalow; +Cc: Carl Baldwin, git

Daniel Barkalow <barkalow@iabervon.org> writes:

> I think that git-read-tree -u ought to remove a directory if it removes
> the last file (or directory) in it.

I concur and do not have much objections to a patch that would
do so.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2005-08-24  0:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-08-23 16:21 [RFC] Removing deleted files after checkout Carl Baldwin
2005-08-23 19:43 ` Daniel Barkalow
2005-08-23 20:50   ` Carl Baldwin
2005-08-23 21:27     ` Daniel Barkalow
2005-08-23 21:40       ` Carl Baldwin
2005-08-23 22:12         ` Daniel Barkalow
2005-08-23 21:54       ` Junio C Hamano
2005-08-23 22:21         ` Carl Baldwin
2005-08-23 22:34           ` Daniel Barkalow
2005-08-24  0:02             ` Junio C Hamano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).