Git data exporter
gitfast -export [<options>] | gitfast -import
--progress=<n> Insert progress statements every <n> objects, to be shown by gitfast -import during import .
--signed -tags=(verbatim|warn|warn -strip|strip|abort) 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 .
--tag -of -filtered -object=(abort|drop|rewrite) 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 . When asking to abort (which is the default), this program will die when encountering such a tag . With drop it will omit such tags from the output . With rewrite ,if the tagged object is a commit, it will rewrite the tag to tag an ancestor commit (via parent rewriting; see git-rev-list (1))
-M, -C Perform move and/or copy detection, as described in the git-diff (1) manual page, and use it to generate rename and copy commands in the output dump . Note that earlier versions of this command did not complain and produced incorrect results if you gave these options .
--export -marks=<file> Dumps the internal marks table to <file> when complete . Marks are written one per line as :markidSHA -1 . 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 .
--import -marks=<file> 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 . Any commits 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 .
--fake -missing -tagger 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 .
--use -done -feature Start the stream with a featuredone stanza, and terminate it with a done command .
--no -data 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 .
--full -tree 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 first parent) .
--anonymize Anonymize the contents of the repository while still retaining the shape of the history and stored tree . See the section on ANONYMIZING below .
--reference -excluded -parents By default, running a command such as gitfast -export master~5 . .master 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 .
--show -original -ids Add an extra directive to the output for commits and blobs, original-oid <SHA1SUM> . 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) .
--reencode=(yes|no|abort) Specify how to handle encoding header in commit objects . When asking to abort (which is the default), this program will die when encountering such a commit object . With yes ,the commit message will be reencoded into UTF -8 . With no ,the original encoding will be preserved .
--refspec Apply the specified refspec to each ref exported . Multiple of them can be specified .
[<git -rev -list -args> ...] A list of arguments, acceptable to gitrev -parse and gitrev -list ,that specifies the specific objects and references to export . For example, master~10. .master 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 .
$ git fast -export --all | (cd /empty/repository && git fast -import) .RE 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 . .RS 4
$ git fast -export master~5 . .master | sed "s|refs/heads/master|refs/heads/other|" | git fast -import .RE This makes a new branch called other from master~5. .master (i .e . if master has linear history, it will take the last 5 commits) . Note that this assumes that none of the blobs and commit messages referenced by that revision range contains the string refs/heads/master .
$ git fast -export --anonymize --all >anon -stream .RE 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): .RS 4
$ git init anon -repo $ cd anon -repo $ git fast -import < . ./anon -stream $ . . . test your bug . . . .RE If the anonymized repository shows the bug, it may be worth sharing anon-stream 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: .RS 4
$ perl -pe (Aqs/ \ d+/X/g (Aq <anon -stream | sort -u | less .RE 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 .