2009-12-21 12 views
15

ja po prostu czytać git-blame stronę podręcznika jeszcze raz i zauważyłem tę część:Jak wykryć kopiowanie i wklejenie kodu za pomocą git?

Szczególnie przydatnym sposobem jest sprawdzenie, czy dodatkowy plik ma linie utworzone przez kopiowania i wklejania z istniejących plików. Czasami oznacza to, że programista był niechlujny i nie poprawił poprawnie kodu. Można najpierw znaleźć zobowiązują się, że wprowadzono ten plik:

git dziennika --diff-filter = A --pretty = krótki - foo

a następnie opisywanie zmian między popełnić i jego rodziców, używając popełnij ^! notacja:

git winy -C -C -f $ commit ^! - foo

To brzmi całkiem interesująco, ale nie do końca rozumiem, jak to działa i dlaczego. Zastanawiam się, czy można go użyć w haczyku git do wykrycia wklejonego kodu &.

Czy jakiś ekspert git może wyjaśnić efekt użycia powyższych poleceń git razem, i czy można użyć czegoś takiego, żeby git pokazał, czy istnieje duplikacja kodu (może za pomocą "indeksu podobieństwa", który wydaje się git obliczane podczas zmiany nazwy plików)?

Odpowiedz

10

Możesz ręcznie podzielić polecenia.

$ git log --diff-filter=A --pretty=short -- foo 

wyświetla log dla pliku "foo". Opcja --diff-filter wyświetla tylko zatwierdzenia, w których pliki zostały dodane ("A") i wyświetla je w formacie skondensowanym (opcja --pretty=short). (The -- jest standardem mówiąc: „nic, co następuje, jest opcja”, a wszystko po to jest lista nazw plików, na których powinny być stosowane dziennik.)

Następnie:

$ git blame -C -C -f $commit^! -- foo 

git blame przypisuje każdej linii pliku informacje z ostatniego zatwierdzenia. Podwójna opcja -C -C agresywnie sprawdza linie skopiowane z innych plików. Opcja -f pokazuje nazwę oryginalnego zatwierdzenia (co oznacza, że ​​linia została skopiowana z innego pliku, zobaczysz nazwę pliku, z którego został skopiowany). $commit^! jest notacją dla $ commit; sufiks ^! oznacza wykluczenie wszystkich rodziców $ commit.

Zasadniczo pierwsze polecenie (git log) pomaga znaleźć zatwierdzenia, które wprowadziły skopiowane linie; drugi (git blame) pomaga znaleźć źródło dla każdego podejrzanego zatwierdzenia zwróconego przez git log.

+0

Dzięki za wyjaśnienia! Podwójna flaga "C-C" do git winy wygląda naprawdę interesująco –

Powiązane problemy