I've been wondering whether there is a good "git export" solution that creates a copy of a tree without the .git
repository directory. There are at least three methods I know of:
git clone
followed by removing the.git
repository directory.git checkout-index
alludes to this functionality but starts with "Just read the desired tree into the index..." which I'm not entirely sure how to do.git-export
is a third party script that essentially does agit clone
into a temporary location followed byrsync --exclude='.git'
into the final destination.
None of these solutions really strike me as being satisfactory. The closest one to svn export
might be option 1, because both those require the target directory to be empty first. But option 2 seems even better, assuming I can figure out what it means to read a tree into the index.
As I understand the question, it it more about downloading just certain state from the server, without history, and without data of other branches, rather than extracting a state from a local repository (as many anwsers here do).
That can be done like this:
--single-branch
is available since Git 1.7.10 (April 2012).--depth
is (was?) reportedly faulty, but for the case of an export, the mentioned issues should not matter.I found out what option 2 means. From a repository, you can do:
The slash at the end of the path is important, otherwise it will result in the files being in /destination with a prefix of 'path'.
Since in a normal situation the index contains the contents of the repository, there is nothing special to do to "read the desired tree into the index". It's already there.
The
-a
flag is required to check out all files in the index (I'm not sure what it means to omit this flag in this situation, since it doesn't do what I want). The-f
flag forces overwriting any existing files in the output, which this command doesn't normally do.This appears to be the sort of "git export" I was looking for.
A special case answer if the repository is hosted on GitHub.
Just use
svn export
.As far as I know Github does not allow
archive --remote
. Although GitHub is svn compatible and they do have all git repossvn
accessible so you could just usesvn export
like you normally would with a few adjustments to your GitHub url.For example to export an entire repository, notice how
trunk
in the URL replacesmaster
(or whatever the project's HEAD branch is set to):And you can export a single file or even a certain path or folder:
Example with jQuery JavaScript Library
The
HEAD
branch or master branch will be available usingtrunk
:The non-
HEAD
branches will be accessible under/branches/
:All tags under
/tags/
in the same fashion:i have the following utility function in my .bashrc file: it creates an archive of the current branch in a git repository.
From the Git Manual:
Using git-checkout-index to "export an entire tree"
The prefix ability basically makes it trivial to use git-checkout-index as an "export as tree" function. Just read the desired tree into the index, and do:
$ git checkout-index --prefix=git-export-dir/ -a
The equivalent of
inside an existing repo is
The equivalent of
is