Git: how to get all the files changed and new files in a folder or zip?
Assuming you mean you haven't yet committed, and want to package up all of the files that currently have local modifications, you can get the list of modified files with git ls-files --modified
. If you want the files which were changed by the last commit, you could use git diff --name-only HEAD^
. Where you go from there is up to you. Examples:
zip modified-files.zip $(git ls-files --modified)
cp $(git ls-files --modified) ../modified-files
Note that this is using the versions of files in the working tree currently.
If you have spaces in filenames, you'll have to go to a little more trouble.
(Of course, depending on what you're really trying to do, you might be looking for git stash
, which stashes away all modified files and leaves you with a clean working tree, or you could simply want to make a temporary branch to commit to.)
To do exactly what you requested (assuming you already committed and want to create an archive of the files changed by the last commit), you could do:
git archive --format=zip HEAD `git diff HEAD^ HEAD --name-only` > a.zip
If you have removed files in a commit, to prevent a pathspec error use --diff-filter=d
:
git archive --format=zip HEAD `git diff --diff-filter=d HEAD^ HEAD --name-only` > a.zip
But maybe you actually want to create a patch using:
git diff HEAD^ HEAD > a.patch
and apply this patch where you need it using:
patch -p1 < a.patch
Of course, applying a patch only works if your target directory already contains the old version of your repository.
If you use TortoiseGIt, it provides this too.
Choose the folder, in explorer
Right click,Choose menu, TortoiseGit-> Show Log.
Select working directory and the last commiitted version.
Right click. Compare revisions. Select files you want to save/export.
Right Click. Export to folder. Done.
Zip the modified and newly created files in the git repository
zip mychanges.zip $({ (git ls-files --others --exclude-standard) ; (git ls-files --modified)})
Assuming you don't have deleted or renamed files, this should do the trick
Copy:
cp --parents $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev) destination_folder
Zip:
zip modified.zip $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev)