How do I exclude files from git archive?
You can create a tar and then delete folders and files that does not need to be inside
git archive HEAD -o archive.tar
tar -f archive.tar --delete listoffiles1
tar -f archive.tar --delete listoffiles2
tar -f archive.tar --delete listoffiles..
tar -f archive.tar --delete listoffilesN
this way you can split your command line to stay below the maximum cli argument length
With Git version 2.20 (Windows) and Gitolite server (unknown version) this works for me to exclude files and folders named "b":
git archive HEAD . ":!b" | tar tf -
This also works:
git archive HEAD . ":(exclude)b" | tar tf -
Note that I have to use double-quotes on the Windows platform, not sure about other platforms.
This feature is part of pathspec (pattern used to limit paths in Git commands). Also see this answer.
I think you almost nailed it: attributes can be read from several places, with .gitattributes
being only the most common of them. The second one—considered a per-repository configuration—is $GIT_DIR/info/attributes
.
To cite the manual:
Note that attributes are by default taken from the
.gitattributes
files in the tree that is being archived. If you want to tweak the way the output is generated after the fact (e.g. you committed without adding an appropriateexport-ignore
in its.gitattributes
), adjust the checked out.gitattributes
file as necessary and use--worktree-attributes
option. Alternatively you can keep necessary attributes that should apply while archiving any tree in your$GIT_DIR/info/attributes
file.
So, if possible, stick your list to that file and then do git archive
.
Another approach is to not use git archive
but instead merely tar
the work tree passing tar
the --exclude-from
command-line option which accepts a file. This wouldn't work for a bare repository, but if you're OK with checking out stuff before archiving it, this can be done by doing git read-tree
and git checkout-index
supplied with the correct $GIT_INDEX_FILE
and $GIT_WORK_TREE
env. variables.
Another possible workaround is reversing the approach: tar
(at least GNU tar) supports a lesser-known option of being able to delete stuff from an archive in a pipeline.
Basically, you can do
$ tar -C a_path -c -f - . \
| tar -f - --wildcards --delete '*.pdf' >result.tar
so that the first tar
in the pipeline archives everything while the second one passes everything through except for files matching the *.pdf
shell glob patten.
So if specifying files to delete using shell globs can be fitted to the command-line limit, just pipe the output of git archive
to a tar
prcocess which removes the stuff not needed.
Instead of putting export-ignore
into a (committed) .gitattributes
, you can also put it into a (not committed) $GIT_DIR/info/attributes
file. Or alternatively leave the .gitattributes
uncommitted and use the --worktree-attributes
option, also that's probably not so nice as it leaves your working tree dirty.