Autogenerated manpages for v2.46.1-603-g94b60a
[git-manpages.git] / man1 / git-fast-export.1
blob1b029ec83a2937ca12f197624b7fabf1357edb6b
1 '\" t
2 .\"     Title: git-fast-export
3 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
4 .\" Generator: DocBook XSL Stylesheets v1.79.2 <http://docbook.sf.net/>
5 .\"      Date: 2024-09-20
6 .\"    Manual: Git Manual
7 .\"    Source: Git 2.46.1.603.g94b60adee3
8 .\"  Language: English
9 .\"
10 .TH "GIT\-FAST\-EXPORT" "1" "2024-09-20" "Git 2\&.46\&.1\&.603\&.g94b60a" "Git Manual"
11 .\" -----------------------------------------------------------------
12 .\" * Define some portability stuff
13 .\" -----------------------------------------------------------------
14 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
15 .\" http://bugs.debian.org/507673
16 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
17 .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18 .ie \n(.g .ds Aq \(aq
19 .el       .ds Aq '
20 .\" -----------------------------------------------------------------
21 .\" * set default formatting
22 .\" -----------------------------------------------------------------
23 .\" disable hyphenation
24 .nh
25 .\" disable justification (adjust text to left margin only)
26 .ad l
27 .\" -----------------------------------------------------------------
28 .\" * MAIN CONTENT STARTS HERE *
29 .\" -----------------------------------------------------------------
30 .SH "NAME"
31 git-fast-export \- Git data exporter
32 .SH "SYNOPSIS"
33 .sp
34 .nf
35 \fIgit fast\-export\fR [<options>] | \fIgit fast\-import\fR
36 .fi
37 .SH "DESCRIPTION"
38 .sp
39 This program dumps the given revisions in a form suitable to be piped into \fIgit fast\-import\fR\&.
40 .sp
41 You can use it as a human\-readable bundle replacement (see \fBgit-bundle\fR(1)), or as a format that can be edited before being fed to \fIgit fast\-import\fR in order to do history rewrites (an ability relied on by tools like \fIgit filter\-repo\fR)\&.
42 .SH "OPTIONS"
43 .PP
44 \-\-progress=<n>
45 .RS 4
46 Insert
47 \fIprogress\fR
48 statements every <n> objects, to be shown by
49 \fIgit fast\-import\fR
50 during import\&.
51 .RE
52 .PP
53 \-\-signed\-tags=(verbatim|warn|warn\-strip|strip|abort)
54 .RS 4
55 Specify how to handle signed tags\&. Since any transformation after the export can change the tag names (which can also happen when excluding revisions) the signatures will not match\&.
56 .sp
57 When asking to
58 \fIabort\fR
59 (which is the default), this program will die when encountering a signed tag\&. With
60 \fIstrip\fR, the tags will silently be made unsigned, with
61 \fIwarn\-strip\fR
62 they will be made unsigned but a warning will be displayed, with
63 \fIverbatim\fR, they will be silently exported and with
64 \fIwarn\fR, they will be exported, but you will see a warning\&.
65 .RE
66 .PP
67 \-\-tag\-of\-filtered\-object=(abort|drop|rewrite)
68 .RS 4
69 Specify how to handle tags whose tagged object is filtered out\&. Since revisions and files to export can be limited by path, tagged objects may be filtered completely\&.
70 .sp
71 When asking to
72 \fIabort\fR
73 (which is the default), this program will die when encountering such a tag\&. With
74 \fIdrop\fR
75 it will omit such tags from the output\&. With
76 \fIrewrite\fR, if the tagged object is a commit, it will rewrite the tag to tag an ancestor commit (via parent rewriting; see
77 \fBgit-rev-list\fR(1))\&.
78 .RE
79 .PP
80 \-M, \-C
81 .RS 4
82 Perform move and/or copy detection, as described in the
83 \fBgit-diff\fR(1)
84 manual page, and use it to generate rename and copy commands in the output dump\&.
85 .sp
86 Note that earlier versions of this command did not complain and produced incorrect results if you gave these options\&.
87 .RE
88 .PP
89 \-\-export\-marks=<file>
90 .RS 4
91 Dumps the internal marks table to <file> when complete\&. Marks are written one per line as
92 \fB:markid SHA\-1\fR\&. Only marks for revisions are dumped; marks for blobs are ignored\&. Backends can use this file to validate imports after they have been completed, or to save the marks table across incremental runs\&. As <file> is only opened and truncated at completion, the same path can also be safely given to \-\-import\-marks\&. The file will not be written if no new object has been marked/exported\&.
93 .RE
94 .PP
95 \-\-import\-marks=<file>
96 .RS 4
97 Before processing any input, load the marks specified in <file>\&. The input file must exist, must be readable, and must use the same format as produced by \-\-export\-marks\&.
98 .RE
99 .PP
100 \-\-mark\-tags
101 .RS 4
102 In addition to labelling blobs and commits with mark ids, also label tags\&. This is useful in conjunction with
103 \fB\-\-export\-marks\fR
105 \fB\-\-import\-marks\fR, and is also useful (and necessary) for exporting of nested tags\&. It does not hurt other cases and would be the default, but many fast\-import frontends are not prepared to accept tags with mark identifiers\&.
107 Any commits (or tags) that have already been marked will not be exported again\&. If the backend uses a similar \-\-import\-marks file, this allows for incremental bidirectional exporting of the repository by keeping the marks the same across runs\&.
110 \-\-fake\-missing\-tagger
111 .RS 4
112 Some old repositories have tags without a tagger\&. The fast\-import protocol was pretty strict about that, and did not allow that\&. So fake a tagger to be able to fast\-import the output\&.
115 \-\-use\-done\-feature
116 .RS 4
117 Start the stream with a
118 \fIfeature done\fR
119 stanza, and terminate it with a
120 \fIdone\fR
121 command\&.
124 \-\-no\-data
125 .RS 4
126 Skip output of blob objects and instead refer to blobs via their original SHA\-1 hash\&. This is useful when rewriting the directory structure or history of a repository without touching the contents of individual files\&. Note that the resulting stream can only be used by a repository which already contains the necessary objects\&.
129 \-\-full\-tree
130 .RS 4
131 This option will cause fast\-export to issue a "deleteall" directive for each commit followed by a full list of all files in the commit (as opposed to just listing the files which are different from the commit\(cqs first parent)\&.
134 \-\-anonymize
135 .RS 4
136 Anonymize the contents of the repository while still retaining the shape of the history and stored tree\&. See the section on
137 \fBANONYMIZING\fR
138 below\&.
141 \-\-anonymize\-map=<from>[:<to>]
142 .RS 4
143 Convert token
144 \fB<from>\fR
146 \fB<to>\fR
147 in the anonymized output\&. If
148 \fB<to>\fR
149 is omitted, map
150 \fB<from>\fR
151 to itself (i\&.e\&., do not anonymize it)\&. See the section on
152 \fBANONYMIZING\fR
153 below\&.
156 \-\-reference\-excluded\-parents
157 .RS 4
158 By default, running a command such as
159 \fBgit fast\-export master~5\&.\&.master\fR
160 will not include the commit master~5 and will make master~4 no longer have master~5 as a parent (though both the old master~4 and new master~4 will have all the same files)\&. Use \-\-reference\-excluded\-parents to instead have the stream refer to commits in the excluded range of history by their sha1sum\&. Note that the resulting stream can only be used by a repository which already contains the necessary parent commits\&.
163 \-\-show\-original\-ids
164 .RS 4
165 Add an extra directive to the output for commits and blobs,
166 \fBoriginal\-oid <SHA1SUM>\fR\&. While such directives will likely be ignored by importers such as git\-fast\-import, it may be useful for intermediary filters (e\&.g\&. for rewriting commit messages which refer to older commits, or for stripping blobs by id)\&.
169 \-\-reencode=(yes|no|abort)
170 .RS 4
171 Specify how to handle
172 \fBencoding\fR
173 header in commit objects\&. When asking to
174 \fIabort\fR
175 (which is the default), this program will die when encountering such a commit object\&. With
176 \fIyes\fR, the commit message will be re\-encoded into UTF\-8\&. With
177 \fIno\fR, the original encoding will be preserved\&.
180 \-\-refspec
181 .RS 4
182 Apply the specified refspec to each ref exported\&. Multiple of them can be specified\&.
185 [<git\-rev\-list\-args>\&...\:]
186 .RS 4
187 A list of arguments, acceptable to
188 \fIgit rev\-parse\fR
190 \fIgit rev\-list\fR, that specifies the specific objects and references to export\&. For example,
191 \fBmaster~10\&.\&.master\fR
192 causes the current master reference to be exported along with all objects added since its 10th ancestor commit and (unless the \-\-reference\-excluded\-parents option is specified) all files common to master~9 and master~10\&.
194 .SH "EXAMPLES"
196 .if n \{\
197 .RS 4
200 $ git fast\-export \-\-all | (cd /empty/repository && git fast\-import)
202 .if n \{\
206 This will export the whole repository and import it into the existing empty repository\&. Except for reencoding commits that are not in UTF\-8, it would be a one\-to\-one mirror\&.
208 .if n \{\
209 .RS 4
212 $ git fast\-export master~5\&.\&.master |
213         sed "s|refs/heads/master|refs/heads/other|" |
214         git fast\-import
216 .if n \{\
220 This makes a new branch called \fIother\fR from \fImaster~5\&.\&.master\fR (i\&.e\&. if \fImaster\fR has linear history, it will take the last 5 commits)\&.
222 Note that this assumes that none of the blobs and commit messages referenced by that revision range contains the string \fIrefs/heads/master\fR\&.
223 .SH "ANONYMIZING"
225 If the \fB\-\-anonymize\fR option is given, git will attempt to remove all identifying information from the repository while still retaining enough of the original tree and history patterns to reproduce some bugs\&. The goal is that a git bug which is found on a private repository will persist in the anonymized repository, and the latter can be shared with git developers to help solve the bug\&.
227 With this option, git will replace all refnames, paths, blob contents, commit and tag messages, names, and email addresses in the output with anonymized data\&. Two instances of the same string will be replaced equivalently (e\&.g\&., two commits with the same author will have the same anonymized author in the output, but bear no resemblance to the original author string)\&. The relationship between commits, branches, and tags is retained, as well as the commit timestamps (but the commit messages and refnames bear no resemblance to the originals)\&. The relative makeup of the tree is retained (e\&.g\&., if you have a root tree with 10 files and 3 trees, so will the output), but their names and the contents of the files will be replaced\&.
229 If you think you have found a git bug, you can start by exporting an anonymized stream of the whole repository:
231 .if n \{\
232 .RS 4
235 $ git fast\-export \-\-anonymize \-\-all >anon\-stream
237 .if n \{\
241 Then confirm that the bug persists in a repository created from that stream (many bugs will not, as they really do depend on the exact repository contents):
243 .if n \{\
244 .RS 4
247 $ git init anon\-repo
248 $ cd anon\-repo
249 $ git fast\-import <\&.\&./anon\-stream
250 $ \&.\&.\&. test your bug \&.\&.\&.
252 .if n \{\
256 If the anonymized repository shows the bug, it may be worth sharing \fBanon\-stream\fR along with a regular bug report\&. Note that the anonymized stream compresses very well, so gzipping it is encouraged\&. If you want to examine the stream to see that it does not contain any private data, you can peruse it directly before sending\&. You may also want to try:
258 .if n \{\
259 .RS 4
262 $ perl \-pe \*(Aqs/\ed+/X/g\*(Aq <anon\-stream | sort \-u | less
264 .if n \{\
268 which shows all of the unique lines (with numbers converted to "X", to collapse "User 0", "User 1", etc into "User X")\&. This produces a much smaller output, and it is usually easy to quickly confirm that there is no private data in the stream\&.
270 Reproducing some bugs may require referencing particular commits or paths, which becomes challenging after refnames and paths have been anonymized\&. You can ask for a particular token to be left as\-is or mapped to a new value\&. For example, if you have a bug which reproduces with \fBgit rev\-list sensitive \-\- secret\&.c\fR, you can run:
272 .if n \{\
273 .RS 4
276 $ git fast\-export \-\-anonymize \-\-all \e
277       \-\-anonymize\-map=sensitive:foo \e
278       \-\-anonymize\-map=secret\&.c:bar\&.c \e
279       >stream
281 .if n \{\
285 After importing the stream, you can then run \fBgit rev\-list foo \-\- bar\&.c\fR in the anonymized repository\&.
287 Note that paths and refnames are split into tokens at slash boundaries\&. The command above would anonymize \fBsubdir/secret\&.c\fR as something like \fBpath123/bar\&.c\fR; you could then search for \fBbar\&.c\fR in the anonymized repository to determine the final pathname\&.
289 To make referencing the final pathname simpler, you can map each path component; so if you also anonymize \fBsubdir\fR to \fBpublicdir\fR, then the final pathname would be \fBpublicdir/bar\&.c\fR\&.
290 .SH "LIMITATIONS"
292 Since \fIgit fast\-import\fR cannot tag trees, you will not be able to export the linux\&.git repository completely, as it contains a tag referencing a tree instead of a commit\&.
293 .SH "SEE ALSO"
295 \fBgit-fast-import\fR(1)
296 .SH "GIT"
298 Part of the \fBgit\fR(1) suite