Thread (7 messages) flat view 7 messages, 3 authors, 2016-06-15

Re: Empty directories...

From: David Kastrup <hidden>
Date: 2016-06-15 22:43:22

Johan Herland [off-list ref] writes:
On Friday 20 July 2007, David Kastrup wrote:
quoted
Johan Herland [off-list ref] writes:
quoted
Sorry for jumping in late...
It could have given you a chance to read up on what has already been
discussed.
I have tried to keep on top of the discussion so far.
quoted
quoted
Why do you want to add _all_ directories, and not just the ones we
want to explicitly track (independent of whether they're empty or
not).
Because the problematic cases are more often than not the
_implicit_ cases.  Do you check a directory tree for empty
directories before you archive it?  In order to archive every empty
directory explicitly?
No, of course I don't. But then archiving (as in tar) is intended to
recreate the "working copy" exactly as it was. Git (and other SCMs),
however, is only interested in recreating the part of the working
copy it explicitly tracks.
Yes, and
git-add some-dir
tells it to track _everything_ inside some-dir.  Which means that the
included files are tracked _implicitly_.  The included directories
(including some-dir itself) are not.
Given the following working copy:
/
/tracked/
/tracked/file
/tracked/dir/
/untracked/
/untracked/file
/untracked/dir/

and the following commands:
$ git add tracked

$ git clone

The cloned result could be any of the following:

(1)
/
/tracked/
/tracked/file

This is the current behaviour; directories are not tracked at all, but only 
added as necessary to support files.
And so your case (1) actually rather is a single line:

/tracked/file

Everything else is just part of representing /tracked/file and
disappears as soon as /tracked/file disappears.
(2)
/
/tracked/
/tracked/file
/tracked/dir/
/untracked/
/untracked/dir/

i.e. implicitly tracking _all_ directories. This is what you literally ask 
for,
I don't see how you can possibly conclude that from what I have been
writing.
but I think most would find this unreasonable.
And it is.  So please _don't_ put words into my mouth.  In my
proposal, the following (and nothing else) would get tracked:

/tracked/.
/tracked/file

and that's it.  That is what was requested, and that is what is
tracked.  There will be, incidentally, a tree "/tracked/" and a tree
"/" in the _repository_, but those collapse as soon as they are empty.
They are just an _abstract_ data structuring tool in the repository
that is _mapped_ to directories on checkout.
/
/tracked/
/tracked/file
/tracked/dir/

i.e. recursively tracking directories (and files). This seems useful, but 
there is nothing _implicit_ about this.
You did not ask for "/tracked/file" and you did not ask for
"/tracked/dir/" (whatever they may be).  That you wanted to track them
was _implied_ by your request of "/tracked/".
I have a feeling that you're actually arguing for doing (3) by
default.  What I am arguing is to do (1) by default, and (3) if
given a suitable command-line option (i.e. "git add --with-dirs
tracked").

Note that this is really an interface question.
Not at all.  It is a _conceptual_ question: in order for this to work
at _all_ (instead of being an inconsistent heap of ugly surprises),
directories need a representation in the repo.  This representation,
as opposed to in the work file system, is _optional_: the repository
got perfectly well along without it up to now, and the fallback is
already implemented when there is a tree without corresponding
directory.
How these entries are actually stored in the repo is a different
discussion.
Sure.  But anything that requires four dozens of special cases instead
of four because one wanted to keep "things that are under some
specialized view separate separate" is not something I am going to
implement.  I am too old to juggle with complexity for the sake of
complexity.  I can make much more use of the existing infrastructure
by actually making file and directory entries quite similar.

ls -la
also has no special cases for "." and ".." because they are, at a very
fundamental level, very special in achieving a special purpose
_without_ being special-cased.
Finally, let's look at the case of "git add tracked/file" followed
by "git rm tracked/file". I'm arguing that "tracked/" should be
automatically removed, since I never asked for it to be tracked by
git.
Sure.  And nobody ever said otherwise.  In fact, I gave about a dozen
examples in that line and more special in the thread up to now.
On the other hand, "git-add --non-recursive tracked" followed by the
above two commands, should of course leave "tracked/" in place,
since I now actually asked explicitly for the directory to be
tracked.
Sure.  Use "--directory" instead of "--non-recursive" and you have a
somewhat more special option for that.
My point is fundamentally that selectively tracking directories is a
more powerful concept than just tracking _all_ directories by
default.
Perhaps you might read up on some of the past discussion before
beating dead horses.  This has been covered already, and more than
once.  I never asked for "all directories" to be tracked.  I outlined
cases where they are tracked and where not, and I tested that the
mechanisms in "man gitignore" already work _perfectly_ with the
pattern "." for configuring the _implied_ tracking at directory,
repository, project, and user preference level.
Note that if we support selectively tracking directories, tracking
_everything_ (like you seem to want) is trivially implemented by
_always_ supplying the appropriate option to git-add. If we track
everything by design, we don't have the option of selectively
tracking some directories.
But that means manual intervention all of the time.  It is fine when a
tool provides an option to shoot you in the arm instead of in the foot
as usual, but that's not really a fix, but an acerbation of the
problem.
quoted
quoted
Basically, add a "--dir" flag to git-add, git-rm and friends, to
tell them you're acting on the directory itself (rather than its
(recursive) contents). "git-add --dir foo" will add the "040000
123abc... 0 foo" to the index/tree whether or not foo is an empty
directory. "git-rm --dir foo" will remove that entry (or fail if
it doesn't exist), but _not_ the contents of foo.
There is nothing wrong with implementing something like this in
_addition_ to treating directory entries implicitly.
I don't agree. By _selectively_ tracking directories you can
implement any policy you want on top of it.
No, you can't.  Because a "policy" means that things are _implied_.
Being able to do everything manually is not a policy.  It may be a
lifesaver at times, but then you have little business drifting in the
river in the first place.
quoted
But the important, the _really_ important thing are the implicit
behaviors.  If I have to hassle with every directory myself, I
don't need a content tracking system.
I disagree. Just as you have to decide which files to track, you
similarly should have to decide which directories to track. Of
course, the tools make this easier for you by being able to
recursively handle files. In the same way they should be able to do
the same thing for directories.
--directory _explicitly_ is not working recursively, so it does not
solve that problem.

-- 
David Kastrup
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help