Custom Action to create archive of modified files

I'm looking to create a custom action that will generate an archive file containing only the modified files within a specific commit. Here is the working git call:

git archive -o HEAD $(git diff-tree --no-commit-id --name-only -r COMMITID)

This works fine on the mac side and also when called directly from the command line but fails when called via a batch file. I suspect there is some kind of syntax issue specifically related to writing this call within a batch file but I'm unable to figure it out. The error generated is:

unknown option `no-commit-id`

I noticed that if I remove the no-commit-id and name-only options the error becomes:

fatal: path not found: $(git

Any help would be greatly appreciated!

6 answers

1 accepted

That's right. I was able to get an answer from StackOverflow:

setlocal enabledelayedexpansion
set output=
for /f "delims=" %%a in ('git diff-tree --no-commit-id --name-only -r %1^^') do ( set output=!output! "%%a" )
git archive -o HEAD %output%

This doesn't work for the last commit. Let's say I merge some Release branch to Master and then I want to export all files that were merged. In a zip file I get full repository :/ But if I try to export some earlier commit, then I get just the files I need.

So to be clear, you are putting the command in a batch file, and you are going to run the batch file from SourceTree's custom action?

Why is there no option to do it from sourcetree native commands ? We need it when pushing on production... What are the files modified since last release ?

There is no way to do it from SourceTree native commands because there is no way to do it with git native commands.

You should be able to put the script in Gabe's answer in a script file, and run that script from a SourceTree custom action.

I've created a Gist that has the Mac and PC versions of the export script:

I may misunderstand something, but i don't understand how people update their project in production when using git as versioning tool without this command.

Two options:

1) Deploy the entire project, not just differences

2) Use that command (or something similar) without SourceTree.

Git native command do generate archive from one old commit to last commit:

git archive -o c:/ HEAD $(git diff --name-only HASHONLINE HEAD)

That is not a git command, it is a bash script using two separate native commands.

Suggest an answer

Log in or Sign up to answer
How to earn badges on the Atlassian Community

How to earn badges on the Atlassian Community

Badges are a great way to show off community activity, whether you’re a newbie or a Champion.

Learn more
Community showcase
Published May 30, 2018 in Sourcetree

Tip from the team: configuring Git or Mercurial in Sourcetree

Supported Platforms macOS Windows To make using Sourcetree as simple yet powerful as possible we embed (bundle) dependencies such as Git, Git LFS, and Mercurial. We strive to keep these...

542 views 1 2
Read article

Atlassian User Groups

Connect with like-minded Atlassian users at free events near you!

Find a group

Connect with like-minded Atlassian users at free events near you!

Find my local user group

Unfortunately there are no AUG chapters near you at the moment.

Start an AUG

You're one step closer to meeting fellow Atlassian users at your local meet up. Learn more about AUGs

Groups near you