prahlad venkata
prahlad venkata

Reputation: 371

git format-patch for all the commits to a file

I want to get patches for all commits that are made to a file/folder.

I can get the list of commit-id through git log --format="%H"-- path/to/folder

Is there a way i can get generate patches from this list.

[edit]:

below code partly solves my problem

for c in `git log --format="%H" -- path/to/file`;do git format-patch "$c^1".."$c" -o patches ; done

since format-patch is called individually, i will get patches all numbered 0001-commit-text.patch where i will lose the order of patches. Is there any better solutions

Upvotes: 9

Views: 6205

Answers (4)

sastorsl
sastorsl

Reputation: 2135

Building on the rest of the answers.

If you want all the commits for a file which is in the initial / very first commit you must omit the SHA. Even <SHA>^1 will not "work" in this case.

git format-patch --root

Refering to How to use git format-patch on initial commit

Upvotes: 2

saulius2
saulius2

Reputation: 271

My slight improvization (just composed) by using only git:

git format-patch $(git rev-list --max-parents=0 HEAD)..HEAD -- path/to/file

Might not work if the rev-list --max-parents returns more than one commit. Used idea from that post:

How to show first commit by 'git log'?

Upvotes: 6

kofman
kofman

Reputation: 106

You can try git diff initial_commit_id..latest_commit_id > changes.patch

This is based on this article: https://www.lullabot.com/articles/git-best-practices-upgrading-the-patch-process

For example:

git diff ab0b3a55de5..6f5dbbc4187b97

Update: if you provide the path to the specific file as an argument to format-patch it'll only create patches for the commits with changes to that file. So no need for the loop and one-by-one invocation of format-patch. See example in format-patch for a single file

So try this:

get format-patch from..to -o patches /path/to/file 

Upvotes: 5

prahlad venkata
prahlad venkata

Reputation: 371

Come up with the below shell script to achieve this. any other answers are welcome.

#!/bin/bash
COUNTER=1;
for c in `git log --format="%H" --reverse -- path/to/file`;do
    git format-patch --start-number=$COUNTER "$c^1".."$c" -o patches
    let COUNTER=COUNTER+1
done

Upvotes: 7

Related Questions