Git Diff problems after bulk rename -


i having lot of trouble working git history after bulk rename applied large project (slightly under 10,000 files). have changed project layout moving files project/src/.... project/src/main/java/..... have modified of moved files in same commit.

let's take @ 1 such file:

$ git logc pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java * commit 6e7a960f99b0e6164d2713a4cbca2107034d8bbd   author: moffats <moffats@ec78347f-1a2b-0410-964c-a7254f1fcdc6>   date:   thu apr 23 21:24:30 2015 +0000        merge gradle branch trunk 

ok, looks need use --follow tell git follow renames:

$ git logc --follow pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java ... * commit 6e7a960f99b0e6164d2713a4cbca2107034d8bbd | author: moffats <moffats@ec78347f-1a2b-0410-964c-a7254f1fcdc6> | date:   thu apr 23 21:24:30 2015 +0000 |  |     merge gradle branch trunk |      ... * commit ce0c98d4b78e2f006ead16a030b3c5f0d7ec3ac0   author: perches <perches@ec78347f-1a2b-0410-964c-a7254f1fcdc6>   date:   thu mar 22 21:29:41 2012 +0000        updates jsf 2.0 upgrade 

there go. let's compare 2 versions:

$ git diff -m -l0 ce0c98d4b78e2f006ead16a030b3c5f0d7ec3ac0..head pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java diff --git a/pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java b/pinssuserpasswordutil/src/main/java/ new file mode 100644 index 0000000..acc4d40 --- /dev/null +++ b/pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java @@ -0,0 +1,186 @@ +package ca.gc.agr.pinss.userpasswordutil; + +import java.io.fileinputstream; +import java.io.ioexception; +import java.sql.connection; +import java.sql.resultset; +import java.sql.sqlexception; +import java.sql.statement; +import java.util.map.entry; +import java.util.properties; + +import org.apache.commons.logging.log; +import org.apache.commons.logging.logfactory; ... etc ... 

git not detecting rename. it's not finding old location of file, , telling me entire file content added. note it's comparing existing file /dev/null, rather old file path, should be:

pinssuserpasswordutil/src/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java 

ok, let's examine commit renamed looks like:

$ git show --stat=180 6e7a960f99b0e6164d2713a4cbca2107034d8bbd | grep userpasswordreseter  pinssuserpasswordutil/src/{ => main/java}/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java               |   10 +- 

this looks good, stuck. way can diff need explicitly telling git old file path used be:

$ git diff ce0c98d4b78e2f006ead16a030b3c5f0d7ec3ac0:pinssuserpasswordutil/src/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java head:pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java  -- a/ce0c98d4b78e2f006ead16a030b3c5f0d7ec3ac0:pinssuserpasswordutil/src/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java +++ b/head:pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java @@ -29,18 +29,18 @@ public class userpasswordreseter {         private static final log log = logfactory.getlog(userpasswordreseter.class);          private static final string datasource_bean_name = "datasource"; -       private static final string user_properties = "configuration/users.properties"; +       private static final string user_properties = "/users.properties"; 

and want.

so why did previous 'git diff -m -l0' command not work? think problem causes such tools egit in eclipse , 'git instaweb' not work anymore, means lost ability access pre-rename history powerful gui tools.

i not sure how can fix @ point. suggestions appreciated.

git version 1.9.1

edit: pointed out in comments, command:

git diff -m -l0 ce0c98d4b78e2f006ead16a030b3c5f0d7ec3ac0..head pinssuserpasswordutil/src/main/java/ca/gc/agr/pinss/userpasswordutil/userpasswordreseter.java 

didn't work, b/c need run diff on whole repository in order rename detection work. command works correctly:

$ git diff -m -l0 ce0c98d4b78e2f006ead16a030b3c5f0d7ec3ac0 head 

of course, need file interested in inside big diff output whole commit, save me trouble of having type old , new paths. still far ideal, better before.

rename detection computationally expensive (see next paragraph), git limits whatever configure. if don't configure particular value, git has built in defaults have increased on various releases (was 100, 200, 400).

in particular, when comparing 2 revisions (or more precisely, 2 trees), path-names appear in "old" tree , not "new" tree provide source candidate files renames, , path-names appear in "new" tree not "old" tree provide destination candidates renames. detect actual rename, git must compare every possible source against every possible destination.

as far know, git not (currently) have "renamed directory, tail part of file names same" heuristic reduce size of list. if did whole lot here. without it, can try setting rename limit high (to many path names needed), using -l option git diff or diff.renamelimit configuration variable. setting explicit 0 means "unlimited" (which 32767 internally, hence not quite unlimited).


Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -