17

янв

Active10 months ago

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:

Lalon geeti by farida parveen - Break the Cycle Charity. File size:1.09 MB click ♬ to download Lalon boi pore na full song. Translate this page Download Bangla books in pdf form mediafire.com and also read it online.

  1. git clone followed by removing the .git repository directory.
  2. 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.
  3. 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.

Peter O.
22.3k9 gold badges60 silver badges72 bronze badges
Greg HewgillGreg Hewgill
711k156 gold badges1038 silver badges1184 bronze badges

31 Answers

12 next

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.

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.

ZIP archive:

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

Be aware that even though the archive will not contain the .git directory, it will, however, contain other hidden git-specific files like .gitignore, .gitattributes, etc. If you don't want them in the archive, make sure you use the export-ignore attribute in a .gitattributes file and commit this before doing your archive. Read more..

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

(See Greg's answer for more details)

Jean-François Corbett
29.6k22 gold badges114 silver badges165 bronze badges
CB BaileyCB Bailey
551k82 gold badges571 silver badges616 bronze badges

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.

etarion
14k2 gold badges34 silver badges63 bronze badges
Greg HewgillGreg Hewgill
711k156 gold badges1038 silver badges1184 bronze badges

git archive also works with remote repository.

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

user456814
Aleksandr SomovAleksandr Somov
2,6281 gold badge12 silver badges5 bronze badges

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 repos svn accessible so you could just use svn 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 replaces master (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 using trunk:

PowerDirector is the best video editor app with powerful multiple track timeline video editing, video effects, slow motion, reverse video & more! This easy video editor lets you create voiceovers & action movie effects using chroma key. Crop and create HD videos with ease. Plus, fix videos with shaky cam footage with our new video stabilizer to keep your shots smooth and free from stutters. Powerdirector app download.

The non-HEADbranches will be accessible under /branches/:

All tags under /tags/ in the same fashion:

Anthony HatzopoulosAnthony Hatzopoulos
9,1322 gold badges31 silver badges54 bronze badges

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

jperrasjperras

I've written a simple wrapper around git-checkout-index that you can use like this:

If the destination directory already exists, you'll need to add -f or --force.

Installation is simple; just drop the script somewhere in your PATH, and make sure it's executable.

Daniel SchierbeckDaniel Schierbeck
1,3192 gold badges14 silver badges22 bronze badges

It appears that this is less of an issue with Git than SVN. Git only puts a .git folder in the repository root, whereas SVN puts a .svn folder in every subdirectory. So 'svn export' avoids recursive command-line magic, whereas with Git recursion is not necessary.

kostmokostmo
4,6254 gold badges33 silver badges47 bronze badges

The equivalent of

inside an existing repo is

The equivalent of

is

aredridelaredridel

If you're not excluding files with .gitattributesexport-ignore then try git checkout

-f
When checking out paths from the index, do not fail upon unmerged entries; instead, unmerged entries are ignored.

and

-q
Avoid verbose

Additionally you can get any Branch or Tag or from a specific Commit Revision like in SVN just adding the SHA1 (SHA1 in Git is the equivalent to the Revision Number in SVN)

The /path/to/checkout/ must be empty, Git will not delete any file, but will overwrite files with the same name without any warning

UPDATE:To avoid the beheaded problem or to leave intact the working repository when using checkout for export with tags, branches or SHA1, you need to add -- ./ at the end

The double dash -- tells git that everything after the dashes are paths or files, and also in this case tells git checkout to not change the HEAD

Examples:

This command will get just the libs directory and also the readme.txt file from that exactly commit

This will create(overwrite) my_file_2_behind_HEAD.txt two commits behind the head HEAD^2

To get the export of another branch

Notice that ./ is relative to the root of the repository


I use git-submodules extensively.This one works for me:

slatvickslatvick
1,0672 gold badges14 silver badges25 bronze badges

I have hit this page frequently when looking for a way to export a git repository. My answer to this question considers three properties that svn export has by design compared to git, since svn follows a centralized repository approach:

  • It minimizes the traffic to a remote repository location by not exporting all revisions
  • It does not include meta information in the export directory
  • Exporting a certain branch using svn is accomplished by specifying the appropriate path

When building a certain release it is useful to clone a stable branch as for example --branch stable or --branch release/0.9.

Lars SchillingmannLars Schillingmann

This will copy all contents, minus the .dot files. I use this to export git cloned projects into my web app's git repo without the .git stuff.

cp -R ./path-to-git-repo /path/to/destination/

Plain old bash works just great :)

HarmonHarmon
2,4081 gold badge14 silver badges16 bronze badges

As simple as clone then delete the .git folder:

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git

teleme.ioteleme.io
5291 gold badge8 silver badges20 bronze badges

Yes, this is a clean and neat command to archive your code without any git inclusion in the archive and is good to pass around without worrying about any git commit history.

Community
zeeawanzeeawan
4,5351 gold badge39 silver badges43 bronze badges

I just want to point out that in the case that you are

  1. exporting a sub folder of the repository (that's how I used to use SVN export feature)
  2. are OK with copying everything from that folder to the deployment destination
  3. and since you already have a copy of the entire repository in place.

Then you can just use cp foo [destination] instead of the mentioned git-archive master foo -x -C [destination].

dkinzerdkinzer
22.4k9 gold badges58 silver badges77 bronze badges

For GitHub users, the git archive --remote method won't work directly, as the export URL is ephemeral. You must ask GitHub for the URL, then download that URL. curl makes that easy:

This will give you the exported code in a local directory. Example:

Edit
If you want the code put into a specific, existing directory (rather than the random one from github):

bishopbishop
26.5k6 gold badges72 silver badges106 bronze badges

You can archive a remote repo at any commit as zip file.

orkodenorkoden
13.9k3 gold badges51 silver badges44 bronze badges

Bash-implementation of git-export.

I have segmented the .empty file creation and removal processes on their own function, with the purpose of re-using them in the 'git-archive' implementation (will be posted later on).

I have also added the '.gitattributes' file to the process in order to remove un-wanted files from the target export folder.Included verbosity to the process while making the 'git-export' function more efficient.

EMPTY_FILE='.empty';

Output:

$ git-export /tmp/rel-1.0.0

Adding '.empty' files to empty folder(s): .. done.

Checking-Out Index component(s): .. done.

Resetting HEAD and Index: .. done.

Purging Git-Specific component(s): ..

'/tmp/rel-1.0.0/{.buildpath}' files .. done.'

'/tmp/rel-1.0.0/{.project}' files .. done.'

'/tmp/rel-1.0.0/{.gitignore}' files .. done.'

'/tmp/rel-1.0.0/{.git}' files .. done.'

'/tmp/rel-1.0.0/{.gitattributes}' files .. done.'

'/tmp/rel-1.0.0/{*.mno}' files .. done.'

'/tmp/rel-1.0.0/{*~}' files .. done.'

'/tmp/rel-1.0.0/{.*~}' files .. done.'

'/tmp/rel-1.0.0/{*.swp}' files .. done.'

'/tmp/rel-1.0.0/{*.swo}' files .. done.'

'/tmp/rel-1.0.0/{.DS_Store}' files .. done.'

'/tmp/rel-1.0.0/{.settings}' files .. done.'

'/tmp/rel-1.0.0/{.empty}' files .. done.'

done.

Archiving Checked-Out component(s): .. done.

-rw-r--r-- 1 admin wheel 25445901 3 Nov 12:57 /tmp/rel-1.0.0.tgz

I have now incorporated the 'git archive' functionality into a single process that makes use of 'create_empty' function and other features.


If you want something that works with submodules this might be worth a go.

Note:

  • MASTER_DIR = a checkout with your submodules checked out also
  • DEST_DIR = where this export will end up
  • If you have rsync, I think you'd be able to do the same thing with even less ball ache.

Assumptions:

  • You need to run this from the parent directory of MASTER_DIR ( i.e from MASTER_DIR cd . )
  • DEST_DIR is assumed to have been created. This is pretty easy to modify to include the creation of a DEST_DIR if you wanted to

cd MASTER_DIR && tar -zcvf ./DEST_DIR/export.tar.gz --exclude='.git*' . && cd ./DEST_DIR/ && tar xvfz export.tar.gz && rm export.tar.gz

Lalon giti zip file download
Rob JensenRob Jensen

My preference would actually be to have a dist target in your Makefile (or other build system) that exports a distributable archive of your code (.tar.bz2, .zip, .jar, or whatever is appropriate). If you happen to be using GNU autotools or Perl's MakeMaker systems, I think this exists for you automatically. If not, I highly recommend adding it.

ETA (2012-09-06): Wow, harsh downvotes. I still believe it is better to build your distributions with your build tools rather than your source code control tool. I believe in building artifacts with build tools. In my current job, our main product is built with an ant target. We are in the midst of switching source code control systems, and the presence of this ant target means one less hassle in migration.

skiphoppyskiphoppy
40.7k62 gold badges158 silver badges206 bronze badges

This will copy the files in a range of commits (C to G) to a tar file. Note: this will only get the files commited. Not the entire repository. Slightly modified from Here

Example Commit History

A --> B -->C --> D --> E --> F --> G --> H --> I

-r --> recurse into sub-trees

--no-commit-id --> git diff-tree outputs a line with the commit ID when applicable. This flag suppressed the commit ID output.

--name-only --> Show only names of changed files.

--diff-filter=ACMRT --> Select only these files. See here for full list of files

C.G --> Files in this range of commits

C~ --> Include files from Commit C. Not just files since Commit C.

xargs tar -rf myTarFile --> outputs to tar

Community
Fuyu PersimmonFuyu Persimmon

I needed this for a deploy script and I couldn't use any of the above mentioned approaches. Instead I figured out a different solution:

troelskntroelskn
94.1k23 gold badges122 silver badges141 bronze badges

Doing it the easy way, this is a function for .bash_profile, it directly unzips the archive on current location, configure first your usual [url:path]. NOTE: With this function you avoid the clone operation, it gets directly from the remote repo.

Alias for .gitconfig, same configuration required (TAKE CARE executing the command inside .git projects, it ALWAYS jumps to the base dir previously as said here, until this is fixed I personally prefer the function

RkGRkG

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.
Ondra ŽižkaOndra Žižka
22.1k28 gold badges153 silver badges223 bronze badges

I think @Aredridel's post was closest, but there's a bit more to that - so I will add this here; the thing is, in svn, if you're in a subfolder of a repo, and you do:

then svn will export all files that are under revision control (they could have also freshly Added; or Modified status) - and if you have other 'junk' in that directory (and I'm not counting .svn subfolders here, but visible stuff like .o files), it will not be exported; only those files registered by the SVN repo will be exported. For me, one nice thing is that this export also includes files with local changes that have not been committed yet; and another nice thing is that the timestamps of the exported files are the same as the original ones. Or, as svn help export puts it:

  1. Exports a clean directory tree from the working copy specified by PATH1, at revision REV if it is given, otherwise at WORKING, into PATH2. .. If REV is not specified, all local changes will be preserved. Files not under version control will not be copied.

To realize that git will not preserve the timestamps, compare the output of these commands (in a subfolder of a git repo of your choice):

.. and:

.. and I, in any case, notice that git archive causes all the timestamps of the archived file to be the same! git help archive says:

git archive behaves differently when given a tree ID versus when given a commit ID or tag ID. In the first case the current time is used as the modification time of each file in the archive. In the latter case the commit time as recorded in the referenced commit object is used instead.

.. but apparently both cases set the 'modification time of each file'; thereby not preserving the actual timestamps of those files!

So, in order to also preserve the timestamps, here is a bash script, which is actually a 'one-liner', albeit somewhat complicated - so below it is posted in multiple lines:

Note that it is assumed that you're exporting the contents in 'current' directory (above, /media/disk/git_svn/subdir) - and the destination you're exporting into is somewhat inconveniently placed, but it is in DEST environment variable. Note that with this script; you must create the DEST directory manually yourself, before running the above script.

After the script is ran, you should be able to compare:

.. and hopefully see the same timestamps (for those files that were under version control).

Hope this helps someone,
Cheers!

Community
sdaausdaau
21.7k28 gold badges159 silver badges217 bronze badges

By far the easiest way i've seen to do it (and works on windows as well) is git bundle:

git bundle create /some/bundle/path.bundle --all

See this answer for more details: How can I copy my git repository from my windows machine to a linux machine via usb drive?

Community
B TB T
30.8k29 gold badges143 silver badges174 bronze badges

I have another solution that works fine if you have a local copy of the repository on the machine where you would like to create the export. In this case move to this repository directory, and enter this command:

GIT_WORK_TREE=outputdirectory git checkout -f

This is particularly useful if you manage a website with a git repository and would like to checkout a clean version in /var/www/. In this case, add thiscommand in a .git/hooks/post-receive script (hooks/post-receive on a bare repository, which is more suitable in this situation)

TomTom
4521 gold badge5 silver badges19 bronze badges

a git export to a zip archive while adding a prefix (e.g. directory name):

DomTomCatDomTomCat
4,6601 gold badge31 silver badges48 bronze badges

If you need submodules as well, this should do the trick: https://github.com/meitar/git-archive-all.sh/wiki

BrandonBrandon

i have the following utility function in my .bashrc file: it creates an archive of the current branch in a git repository.

MichaelMoserMichaelMoser
1,9131 gold badge13 silver badges22 bronze badges

protected by NullPoiиteяJun 10 '13 at 5:05

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).
Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged gitexportgit-archivesvn-export or ask your own question.