Do a "git export" (like "svn export")?

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 a git clone into a temporary location followed by rsync --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.


    Probably the simplest way to achieve this is with git archive . If you really need just the expanded tree you can do something like this.

    git archive master | tar -x -C /somewhere/else
    

    Most of the time that I need to 'export' something from git, I want a compressed archive in any case so I do something like this.

    git archive master | bzip2 >source-tree.tar.bz2
    

    ZIP archive:

    git archive --format zip --output /full/path/to/zipfile.zip master 
    

    git help archive for more details, it's quite flexible.


    Note: If you are interested in exporting the index, the command is

    git checkout-index -a -f --prefix=/destination/path/
    

    (See Greg's answer for more details)


    I found out what option 2 means. From a repository, you can do:

    git checkout-index -a -f --prefix=/destination/path/
    

    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.


    git archive also works with remote repository.

    git archive --format=tar 
    --remote=ssh://remote_server/remote_repository master | tar -xf -
    

    To export particular path inside the repo add as many paths as you wish as last argument to git, eg:

    git archive --format=tar 
    --remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
    
    链接地址: http://www.djcxy.com/p/678.html

    上一篇: 我如何在Windows上安装点子?

    下一篇: 做一个“git export”(如“svn export”)?