2009-06-02 5 views
16

Po przeniesieniu pliku w git (przy użyciu git mv), przeglądanie dziennika dla tego pliku pokazuje tylko zatwierdzenia, w tym i po przeniesieniu.W git, możesz wyświetlić starsze zatwierdzenia zastosowane do pliku po przeniesieniu?

Czy istnieje sposób wyświetlenia zatwierdzeń zastosowanych do pliku pod starą nazwą? W poniższym przykładzie chciałbym zobaczyć zatwierdzenia b04033bdc44f1 i 8ca40d563ce5d w git log po wykonaniu tego ruchu.

$ git init 
Initialized empty Git repository in /Users/ben/code/git_mv_example/.git/ 
$ touch foo 
$ git add foo 
$ git commit -m "Initial commit" 
Created initial commit 8ca40d5: Initial commit 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 foo 
[master*]$ echo "abcdefg" > foo 
[master*]$ git commit -a -m "edited foo" 
Created commit b04033b: edited foo 
1 files changed, 1 insertions(+), 0 deletions(-) 
$ git log foo 
commit b04033bdc44f1eb3477270b4b7ca727377d8c03a 
Author: Ben Brinckerhoff <[email protected]> 
Date: Tue Jun 2 13:26:53 2009 -0600 

    edited foo 

commit 8ca40d563ce5d07d965bfb75a01b9c23378fd321 
Author: Ben Brinckerhoff <[email protected]> 
Date: Tue Jun 2 13:26:15 2009 -0600 

    Initial commit 
$ git mv foo bar 
[master+]$ git commit -a -m "renamed foo to bar" 
Created commit 2bccdf6: renamed foo to bar 
1 files changed, 0 insertions(+), 0 deletions(-) 
rename foo => bar (100%) 
$ git log bar 
commit 2bccdf6fc65b9da5b279d9f1117e436549dd3a7b 
Author: Ben Brinckerhoff <[email protected]> 
Date: Tue Jun 2 13:27:14 2009 -0600 

    renamed foo to bar 
$ git log foo 
fatal: ambiguous argument 'foo': unknown revision or path not in the working tree. 
Use '--' to separate paths from revisions 

Czy to nie jest możliwe? A może jest to niewłaściwe polecenie?

Odpowiedz

16

git-log -M” da historię popełnić z przemianowania informacji, jak wspomniano in GitFaq "Why does git not "track" renames ?"

Maszyna w Git diff posiada wsparcie dla automatycznego wykrywania zmienia nazwę, to jest włączone przez „-M” switch do rodziny git-diff-* polecenia.
Maszyna do zmiany nazwy jest używana przez git-log i git-whatchanged.
Git obsługuje również ograniczoną formę łączenia między różnymi nazwami. Dwa narzędzia do przypisywania winy, oba używają automatycznego kodu zmiany nazwy do śledzenia nazw.

Jako bardzo szczególny przypadek, 'git log' wersja 1.5.3 i później został „--follow” opcja, która pozwala śledzić zmianę nazwy po podaniu pojedynczej ścieżki.


w przykładzie:

F:\prog\git\test\rename>git log --follow bar 
commit 81f52b91eb2fc7ad18051c93f3e4d583f27c15ca 
Author: VonC <> 
Date: Tue Jun 2 21:54:43 2009 +0200 

    renamed foo to bar 

commit 71aff26ace6ab249ab2042d1e5d20377486ce478 
Author: VonC <> 
Date: Tue Jun 2 21:54:19 2009 +0200 

    edited foo 

commit c893199da767eddac6a547b940557435ade4d18c 
Author: VonC <> 
Date: Tue Jun 2 21:53:51 2009 +0200 

    initial commit 

Uwaga: to wszystko jest możliwe, ponieważ nie radykalnie zmodyfikowana treść foo przed zmianą nazwy na pasku. Gdyby zawartość była zupełnie inna, opcja --follow nie byłaby w stanie uzyskać całej historii.

+0

Niesamowite, dziękuję za wspaniałą odpowiedź! –

5

Krótka odpowiedź: użyć

$ git log -M --follow bar 

lub

$ git log -M -- foo bar 

określający zarówno starą i nową nazwę. Przy okazji, ponieważ git używa wykrywania zmiany nazwy opartej na heurystycznym podobieństwie, przykłady zabawek mogą nie działać tak, jak chcesz, podczas gdy rzeczywiste przykłady (lub przykłady z niezmienioną zawartością) działałyby zgodnie z oczekiwaniami.

Należy zauważyć, że w ścieżce git jako argument do git-log nie jest filtr ścieżki, ale ogranicznik ścieżki (i może na przykład być katalogiem).

+0

Dobre punkty. +1. Czy możesz szczegółowo opisać część "detekcja zmiany nazwy opartą na heurystycznym podobieństwie" dotyczącą przykładów "zabawek", w przeciwieństwie do przykładów z życia wziętych? – VonC

+0

Zobacz przykładowe dane wyjściowe do testowania, które zmieniają nazwę w zestawie testów git, np. http://repo.or.cz/w/git.git?a=blob;f=t/t4001-diff-rename.sh –

Powiązane problemy