Home Explore Blog CI



git

17th chunk of `Documentation/git-fast-import.adoc`
d40bc74acab9347b87fa9567702b5486a9ddfe2f8b69d1200000000100000fa7
 `ls`, `get-mark`, and `cat-blob` before
performing writes to fast-import that might block.

CRASH REPORTS
-------------
If fast-import is supplied invalid input it will terminate with a
non-zero exit status and create a crash report in the top level of
the Git repository it was importing into.  Crash reports contain
a snapshot of the internal fast-import state as well as the most
recent commands that lead up to the crash.

All recent commands (including stream comments, file changes and
progress commands) are shown in the command history within the crash
report, but raw file data and commit messages are excluded from the
crash report.  This exclusion saves space within the report file
and reduces the amount of buffering that fast-import must perform
during execution.

After writing a crash report fast-import will close the current
packfile and export the marks table.  This allows the frontend
developer to inspect the repository state and resume the import from
the point where it crashed.  The modified branches and tags are not
updated during a crash, as the import did not complete successfully.
Branch and tag information can be found in the crash report and
must be applied manually if the update is needed.

An example crash:

====
	$ cat >in <<END_OF_INPUT
	# my very first test commit
	commit refs/heads/master
	committer Shawn O. Pearce <spearce> 19283 -0400
	# who is that guy anyway?
	data <<EOF
	this is my commit
	EOF
	M 644 inline .gitignore
	data <<EOF
	.gitignore
	EOF
	M 777 inline bob
	END_OF_INPUT

	$ git fast-import <in
	fatal: Corrupt mode: M 777 inline bob
	fast-import: dumping crash report to .git/fast_import_crash_8434

	$ cat .git/fast_import_crash_8434
	fast-import crash report:
	    fast-import process: 8434
	    parent process     : 1391
	    at Sat Sep 1 00:58:12 2007

	fatal: Corrupt mode: M 777 inline bob

	Most Recent Commands Before Crash
	---------------------------------
	  # my very first test commit
	  commit refs/heads/master
	  committer Shawn O. Pearce <spearce> 19283 -0400
	  # who is that guy anyway?
	  data <<EOF
	  M 644 inline .gitignore
	  data <<EOF
	* M 777 inline bob

	Active Branch LRU
	-----------------
	    active_branches = 1 cur, 5 max

	  pos  clock name
	  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	   1)      0 refs/heads/master

	Inactive Branches
	-----------------
	refs/heads/master:
	  status      : active loaded dirty
	  tip commit  : 0000000000000000000000000000000000000000
	  old tree    : 0000000000000000000000000000000000000000
	  cur tree    : 0000000000000000000000000000000000000000
	  commit clock: 0
	  last pack   :


	-------------------
	END OF CRASH REPORT
====

TIPS AND TRICKS
---------------
The following tips and tricks have been collected from various
users of fast-import, and are offered here as suggestions.

Use One Mark Per Commit
~~~~~~~~~~~~~~~~~~~~~~~
When doing a repository conversion, use a unique mark per commit
(`mark :<n>`) and supply the --export-marks option on the command
line.  fast-import will dump a file which lists every mark and the Git
object SHA-1 that corresponds to it.  If the frontend can tie
the marks back to the source repository, it is easy to verify the
accuracy and completeness of the import by comparing each Git
commit to the corresponding source revision.

Coming from a system such as Perforce or Subversion, this should be
quite simple, as the fast-import mark can also be the Perforce changeset
number or the Subversion revision number.

Freely Skip Around Branches
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Don't bother trying to optimize the frontend to stick to one branch
at a time during an import.  Although doing so might be slightly
faster for fast-import, it tends to increase the complexity of the frontend
code considerably.

The branch LRU builtin to fast-import tends to behave very well, and the
cost of activating an inactive branch is so low that bouncing around
between branches has virtually no impact on import performance.

Handling Renames

Title: Crash Reports and Tips for Git Fast Import
Summary
When fast-import encounters invalid input, it creates a crash report containing the internal state and recent commands, allowing frontend developers to inspect the repository and resume the import, and provides tips and tricks for optimizing the import process, such as using one mark per commit and freely skipping around branches, to simplify frontend code and improve performance.