summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Shawn O. Pearce <spearce@spearce.org>2007-02-07 02:42:44 -0500
committerLibravatar Shawn O. Pearce <spearce@spearce.org>2007-02-07 02:42:44 -0500
commit820b9310127afe3533bb57034d6f458f5aed3e7e (patch)
treee579cc8fa4d21d43a6b0e20e798203231ab55aeb
parentTeach fast-import how to sit quietly in the corner. (diff)
downloadtgif-820b9310127afe3533bb57034d6f458f5aed3e7e.tar.xz
Dump all refs and marks during a checkpoint in fast-import.
If the frontend asks us to checkpoint (via the explicit checkpoint command) its probably because they are afraid the current import will crash/fail/whatever and want to make sure they can pickup from the last checkpoint. To do that sort of recovery, we will need the current tip of every branch and tag available at the next startup. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
-rw-r--r--Documentation/git-fast-import.txt24
-rw-r--r--fast-import.c12
2 files changed, 27 insertions, 9 deletions
diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt
index beab7f0a54..1e12d210c9 100644
--- a/Documentation/git-fast-import.txt
+++ b/Documentation/git-fast-import.txt
@@ -650,17 +650,31 @@ a data chunk which does not have an LF as its last byte.
`checkpoint`
~~~~~~~~~~~~
-Forces gfi to close the current packfile and start a new one.
-As this requires a significant amount of CPU time and disk IO
-(to compute the overall pack SHA-1 checksum and generate the
-corresponding index file) it can easily take several minutes for
-a single `checkpoint` command to complete.
+Forces gfi to close the current packfile, start a new one, and to
+save out all current branch refs, tags and marks.
....
'checkpoint' LF
LF
....
+Note that gfi automatically switches packfiles when the current
+packfile reaches \--max-pack-size, or 4 GiB, whichever limit is
+smaller. During an automatic packfile switch gfi does not update
+the branch refs, tags or marks.
+
+As a `checkpoint` can require a significant amount of CPU time and
+disk IO (to compute the overall pack SHA-1 checksum, generate the
+corresponding index file, and update the refs) it can easily take
+several minutes for a single `checkpoint` command to complete.
+
+Frontends may choose to issue checkpoints during extremely large
+and long running imports, or when they need to allow another Git
+process access to a branch. However given that a 30 GiB Subversion
+repository can be loaded into Git through gfi in about 3 hours,
+explicit checkpointing may not be necessary.
+
+
Packfile Optimization
---------------------
When packing a blob gfi always attempts to deltify against the last
diff --git a/fast-import.c b/fast-import.c
index 858df17f35..d9ed3e2f18 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -838,7 +838,7 @@ static void end_packfile(void)
last_blob.depth = 0;
}
-static void checkpoint(void)
+static void cycle_packfile(void)
{
end_packfile();
start_packfile();
@@ -931,7 +931,7 @@ static int store_object(
/* This new object needs to *not* have the current pack_id. */
e->pack_id = pack_id + 1;
- checkpoint();
+ cycle_packfile();
/* We cannot carry a delta into the new pack. */
if (delta) {
@@ -1940,8 +1940,12 @@ static void cmd_reset_branch(void)
static void cmd_checkpoint(void)
{
- if (object_count)
- checkpoint();
+ if (object_count) {
+ cycle_packfile();
+ dump_branches();
+ dump_tags();
+ dump_marks();
+ }
read_next_command();
}