I figured this out in a Gist in 2016 which has attracted a bunch of comments over the years. Now I'm upgrading it to a retroactive TIL.
Run this in the repository folder:
git archive --format=tar.gz -o /tmp/my-repo.tar.gz --prefix=my-repo/ main
This will write out a file to /tmp/my-repo.tar.gz.
When you tar -xzvf my-repo.tar.gz that file it will output a my-repo/ directory with just the files - not the .git folder - from your repository.
You can use a commit hash or tag or branch name instead of main to create an archive of a different point in that repository.
Without the --prefix option you'll get a .tar.gz file which, when compressed, writes a bunch of stuff to your current directory. This usually isn't what you want!
Here's a version that picks up the name of the directory you run it in:
git archive --format=tar.gz -o $(basename $PWD).tar.gz --prefix=$(basename $PWD)/ main
Note the trailing / on --prefix - without this you'll get folders called things like datasettetests.
basename $PWD gives you the name of your current folder.
Created 2022-11-15T21:27:25-08:00 · Edit