git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: cvsexportcommit dies when applying an (empty) merge commit

From
Michael J Gruber <git@drmicha.warpmail.net>
Date
Nov 25, 2009, 13:06 UTC
Message-ID
<4B0D2BC5.1000002@drmicha.warpmail.net>
In-Reply-To
<4B0D1C1A.60707@yahoo.co.uk>
Nick Woolley venit, vidit, dixit 25.11.2009 12:59:
Show 61 quoted lines
> Hi,
> 
> I have a git repository with a merge point on the master branch.  This merge
> commit is empty, and just contains a commit message:
> 
>   Merge commit 'otherbranch'
> 
> I'm trying to export this branch into CVS using git-cvsexportcommit (the latest
> version from the master branch). It's actually done in a wrapper script [1] but
> the command that gets invoked is essentially:
> 
>  git cvsexportcommit -p -v -u -w  'cvscheckout/HEAD/my-cvs-module' -c \
>     <parent commit> <commit>
> 
> Where <commit> is the empty merge commit.  However this invocation dies and
> aborts the process of exporting the branch half way.
> 
> The fatal error I get is:
> 
>  Applying to CVS commit <commit> from parent <parent commit>
>  Checking if patch will apply
>  Applying
>  error: No changes
>  cannot patch at /usr/lib/git-core/git-cvsexportcommit line 324.
> 
> The vicinity of line 324 is (with some lines wrapped):
> 
>  print "Applying\n";
>  if ($opt_W) {
>      system("git checkout -q $commit^0") && die "cannot patch";
>  } else {
>      `GIT_DIR= git-apply $context --summary --numstat --apply
> <.cvsexportcommit.diff` || die "cannot patch";
>  }
> 
> It seems that the file .cvsexportcommit.diff is empty, so git-apply is refusing
> to apply it.
> 
> Presumably the application would be a no-op, so this git-apply step could be
> skipped.  So I tried modifying the script to do that and it seems to work:
> 
>  print "Applying\n";
>  if ($opt_W) {
>      system("git checkout -q $commit^0") && die "cannot patch";
>  } elsif (-s ".cvsexportcommit.diff") {
>      `GIT_DIR= git-apply $context --summary --numstat --apply
> <.cvsexportcommit.diff` || die "cannot patch";
>  } else {
>     print "No changes\n";
>  }
> 
> The modified git-cvsexportcommit script completes without errors, but
> unsurprisingly, seems to export nothing, so that when imported back into git,
> there is no empty commit.  There appears to be no log message added in CVS, either.
> 
> This does seem more acceptable than dying, although it doesn't faithfully
> reproduce the git history.  However I'm not sure if that would be possible in
> this case.
> 
> Is the existing behaviour deliberately fatal, or is this worth supplying a patch
> for?

I think the behavior is correct in the sense that you're telling git cvsexportcommit to make a commit to cvs, and it can't, because there is no change to commit. A merge can't be represented.

It leaves you the choice between omitting the trivial merge from cvs history (that's what one would do for a merge based cvs<->git workflow) and generating a fake commit in cvs. I don't know if it has something like --allow-empty - it's file base, after all.

Michael
Previous: Nick WoolleyNext: Nick Woolley
Message 2 of 4 in “cvsexportcommit dies when applying an (empty) merge commit”
  1. Nick WoolleyNov 25, 2009
  2. Michael J GruberNov 25, 2009
  3. Nick WoolleyNov 25, 2009
  4. Robin RosenbergNov 26, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.