Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

git add --patch with difftool

Tags:

git

Is it possible to configure Git to use my configured difftool with git add --patch?

I would like to pick the changes to add to the index via my own difftool.

like image 359
HaxElit Avatar asked Jan 26 '12 19:01

HaxElit


People also ask

What is Difftool in git?

git difftool is a Git command that allows you to compare and edit files between revisions using common diff tools. git difftool is a frontend to git diff and accepts the same options and arguments.

How do I use git Difftool meld?

You use git difftool in exactly the same way as you use git diff . e.g. If properly configured a Meld window will open displaying the diff using a GUI interface. Finally the prompt = false line simply stops git from prompting you as to whether you want to launch Meld or not, by default git will issue a prompt.

How do I create a patch in git bash?

In order to create Git patch file for a specific commit, use the “git format-patch” command with the “-1” option and the commit SHA. In order to get the commit SHA, you have to use the “git log” command and look for the corresponding commit SHA.


1 Answers

No, unfortunately.

I suppose I can see that working - Git generates a temporary file based on what's currently in the index, hands it to the difftool along with a copy of the current work tree version (to protect you from making further changes), lets you use the difftool to move some of the changes to the index version, then once you save and quit, stages whatever content is in that modified index version. Note that this would require the difftool to also be a bit of an editor, and not all valid difftools are; some of them are just for viewing diffs. Note also that this is basically bypassing all of git add -p. You wouldn't have any of the normal interface from it for moving between hunks, splitting hunks, and so on. The difftool would be entirely responsible for all of that.

If your difftool is fully-featured enough to do this sort of thing, then I suppose you could write a script to do it. An outline, without really any error protection, handling of special cases (binary files?), and completely untested:

#!/bin/bash tmpdir=$(mktemp -d) git diff --name-only | while read file; do     cp "$file" $tmpdir     # this has your changes in it     work_tree_version="$tmpdir/$file"     # this has the pristine version     index_version=$(git checkout-index --temp "$file")     # and now you bring changes from the work tree version into the index version,     # within the difftool, and save the index version and quit when done     my_difftool "$work_tree_version" "$index_version"      # swap files around to run git add     mv "$file" "$work_tree_version"     mv "$index_version" "$file"     git add "$file"     mv "$work_tree_version" "$file"     # you could also do this by calculating the diff and applying it directly to the index     # git diff --no-index -- "$file" "$original_index_version" | git apply --cached  rm -r $tmpdir 

Probably a lot of ways to improve that; sorry I don't have time to be careful and thorough with it right now.

like image 164
Cascabel Avatar answered Sep 22 '22 11:09

Cascabel