data\r
('from' SP <committish> LF)?\r
('merge' SP <committish> LF)?\r
- (filemodify | filedelete | filerename | filedeleteall)*\r
+ (filemodify | filedelete | filecopy | filerename | filedeleteall)*\r
LF</tt></pre>\r
</div></div>\r
<p>where <tt><ref></tt> is the name of the branch to make the commit on.\r
commit message use a 0 length data. Commit messages are free-form\r
and are not interpreted by Git. Currently they must be encoded in\r
UTF-8, as fast-import does not permit other encodings to be specified.</p>\r
-<p>Zero or more <tt>filemodify</tt>, <tt>filedelete</tt>, <tt>filename</tt> and\r
-<tt>filedeleteall</tt> commands\r
+<p>Zero or more <tt>filemodify</tt>, <tt>filedelete</tt>, <tt>filecopy</tt>, <tt>filerename</tt>\r
+and <tt>filedeleteall</tt> commands\r
may be included to update the contents of the branch prior to\r
creating the commit. These commands may be supplied in any order.\r
However it is recommended that a <tt>filedeleteall</tt> command preceed\r
-all <tt>filemodify</tt> and <tt>filerename</tt> commands in the same commit, as\r
-<tt>filedeleteall</tt>\r
+all <tt>filemodify</tt>, <tt>filecopy</tt> and <tt>filerename</tt> commands in the same\r
+commit, as <tt>filedeleteall</tt>\r
wipes the branch clean (see below).</p>\r
<h4><tt>author</tt></h4>\r
<p>An <tt>author</tt> command may optionally appear, if the author information\r
<p>here <tt><path></tt> is the complete path of the file or subdirectory to\r
be removed from the branch.\r
See <tt>filemodify</tt> above for a detailed description of <tt><path></tt>.</p>\r
+<h4><tt>filecopy</tt></h4>\r
+<p>Recursively copies an existing file or subdirectory to a different\r
+location within the branch. The existing file or directory must\r
+exist. If the destination exists it will be completely replaced\r
+by the content copied from the source.</p>\r
+<div class="literalblock">\r
+<div class="content">\r
+<pre><tt> 'C' SP <path> SP <path> LF</tt></pre>\r
+</div></div>\r
+<p>here the first <tt><path></tt> is the source location and the second\r
+<tt><path></tt> is the destination. See <tt>filemodify</tt> above for a detailed\r
+description of what <tt><path></tt> may look like. To use a source path\r
+that contains SP the path must be quoted.</p>\r
+<p>A <tt>filecopy</tt> command takes effect immediately. Once the source\r
+location has been copied to the destination any future commands\r
+applied to the source location will not impact the destination of\r
+the copy.</p>\r
<h4><tt>filerename</tt></h4>\r
<p>Renames an existing file or subdirectory to a different location\r
within the branch. The existing file or directory must exist. If\r
location has been renamed to the destination any future commands\r
applied to the source location will create new files there and not\r
impact the destination of the rename.</p>\r
+<p>Note that a <tt>filerename</tt> is the same as a <tt>filecopy</tt> followed by a\r
+<tt>filedelete</tt> of the source location. There is a slight performance\r
+advantage to using <tt>filerename</tt>, but the advantage is so small\r
+that it is never worth trying to convert a delete/add pair in\r
+source material into a rename for fast-import. This <tt>filerename</tt>\r
+command is provided just to simplify frontends that already have\r
+rename information and don't want bother with decomposing it into a\r
+<tt>filecopy</tt> followed by a <tt>filedelete</tt>.</p>\r
<h4><tt>filedeleteall</tt></h4>\r
<p>Included in a <tt>commit</tt> command to remove all files (and also all\r
directories) from the branch. This command resets the internal\r
</div>\r
<div id="footer">\r
<div id="footer-text">\r
-Last updated 10-Jul-2007 07:49:19 UTC\r
+Last updated 15-Jul-2007 07:18:25 UTC\r
</div>\r
</div>\r
</body>\r
data
('from' SP <committish> LF)?
('merge' SP <committish> LF)?
- (filemodify | filedelete | filerename | filedeleteall)*
+ (filemodify | filedelete | filecopy | filerename | filedeleteall)*
LF
....
and are not interpreted by Git. Currently they must be encoded in
UTF-8, as fast-import does not permit other encodings to be specified.
-Zero or more `filemodify`, `filedelete`, `filename` and
-`filedeleteall` commands
+Zero or more `filemodify`, `filedelete`, `filecopy`, `filerename`
+and `filedeleteall` commands
may be included to update the contents of the branch prior to
creating the commit. These commands may be supplied in any order.
However it is recommended that a `filedeleteall` command preceed
-all `filemodify` and `filerename` commands in the same commit, as
-`filedeleteall`
+all `filemodify`, `filecopy` and `filerename` commands in the same
+commit, as `filedeleteall`
wipes the branch clean (see below).
`author`
be removed from the branch.
See `filemodify` above for a detailed description of `<path>`.
+`filecopy`
+^^^^^^^^^^^^
+Recursively copies an existing file or subdirectory to a different
+location within the branch. The existing file or directory must
+exist. If the destination exists it will be completely replaced
+by the content copied from the source.
+
+....
+ 'C' SP <path> SP <path> LF
+....
+
+here the first `<path>` is the source location and the second
+`<path>` is the destination. See `filemodify` above for a detailed
+description of what `<path>` may look like. To use a source path
+that contains SP the path must be quoted.
+
+A `filecopy` command takes effect immediately. Once the source
+location has been copied to the destination any future commands
+applied to the source location will not impact the destination of
+the copy.
+
`filerename`
^^^^^^^^^^^^
Renames an existing file or subdirectory to a different location
applied to the source location will create new files there and not
impact the destination of the rename.
+Note that a `filerename` is the same as a `filecopy` followed by a
+`filedelete` of the source location. There is a slight performance
+advantage to using `filerename`, but the advantage is so small
+that it is never worth trying to convert a delete/add pair in
+source material into a rename for fast-import. This `filerename`
+command is provided just to simplify frontends that already have
+rename information and don't want bother with decomposing it into a
+`filecopy` followed by a `filedelete`.
+
`filedeleteall`
^^^^^^^^^^^^^^^
Included in a `commit` command to remove all files (and also all