Subject: Re: [PATCH v2 1/2] convert: fix normalization of foreign idents

From: Marcus Comstedt <[email-masked]>
Date: Sun, 12 Sep 2010 23:01:53 +0200

Hi Junio.

Junio C Hamano <[email-masked]> writes:

> Would it be possible that the real culprit is that ident_to_worktree()
> does not always touch $Id$ in the first place?  Why isn't "$Id: garbage$"
> first cleaned and then smudged upon checkout?

Please see commit 07814d90095b65b4594efd47c69f9f171ef162d4, and
the discussion preceeding it.

> It also smells wrong that this "sometimes we convert, sometimes we don't"
> is a special case for "$Id$" and for no other conversion.  Why don't
> smudge/clean filter or CRLF conversion have the same issue that can be
> solved with the same approach as this patch takes?

I gather that this is because nobody has come up with a use case
for smudge/clean or CRLF where a (pervasive) non-normalized
representation in the repository makes sense.

Specifically, a foreign ident in the repo is not "garbage", but
something useful when you migrate a repo from a different VCS for (at
least) the following reasons:

* It allows you to check out a historical tree from the git repo which
  looks exactly like what it would look like if you checked it out
  from the previous system

* It provides an indication that a version of a file comes directly
  from the previous VCS, without any modification since the migration
  to git, and exactly where in the history of the previous VCS it has
  originated

* Quite frankly, idents generated by other VCSs contain more useful
  information than those generated by git, so it's a waste to discard
  them prematurely

The same effect can be achieved without direct support for foreign
idents by instead using fine-grained control in .gitattributes to
force -ident on any file which still has foreign idents, but there are
two downsides to this approach:

* A commit hook (and probably a pre-receive hook at the "blessed"
  repository) is needed to make sure that no commits are allowed to a
  file with foreign idents without also flipping the attribute from
  -ident to +ident

* Either a full enumeration of all files with foreign idents, or
  of all files with native idents, is needed in .gitattributes, so
  that a file can be either added to or removed from this list when
  making the first "native" commit to it

So it's possible, albeit slightly less practical, to do without this
feature.  If the decision to include it is reversed, 07814d90095b65
should probably be reverted.

  // Marcus