2010-10-08 8 views
19

Ich möchte eine Funktion aus einer Datei und fügen Sie es in eine andere, aber behalten Sie die Schuld Geschichte.Halten Sie Git-Geschichte beim Teilen einer Datei

cp a.php b.php 

vim b.php 
# delete everything but 1 function 

vim a.php 
# delete the 1 function 

git add a.php b.php 
git commit 

Aber wenn ich git blame b.php laufen sehe ich es nur auf diese neue Schuld begehen.

Antwort

4

Vielleicht ist diese vorherige SO Frage könnte aufschlussreich sein:

How does git track source code moved between files?

die akzeptierte Antwort paraphrasieren: im Wesentlichen, Git nicht wirklich "store" Code bewegt; wenn Dinge wie Schuldzuweisungen für verschobenen Code erzeugt werden, ist das ex post facto durch Untersuchung des Zustands des gesamten Repository von commit zu commit.

+0

diese Antwort klingt wie ein „nein“, aber es ist ein wirklich „manchmal.“ Das Löschen scheint das zu sein, was Git dazu veranlasst, eine Datei nach einem Verlauf zu suchen, der über den Geburtsdatum anderer Dateien hinausgeht. Das Teilen einer Funktion, aber das Speichern des Rests einer Datei als OP funktioniert möglicherweise nicht. Aber ich spalte nur eine Datei in zwei Hälften, lösche das Original und gebe ihm zwei neue Namen, und die Schuld wird in beiden neuen Dateien korrekt zugewiesen. – Potatoswatter

+0

Woops, das war erst nach dem Bearbeiten. Nach dem Begehen hat es offenbar die Schuld für eine der neuen Dateien verloren. Vielleicht noch ein Vielleicht? – Potatoswatter

5

versuchen git blame -C -C b.php

+0

Ich möchte, dass die Geschichte den älteren Commits die Schuld gibt. Wir benutzen git-svn, also werden andere auf svn sein. –

+0

Schade. SVN unterstützt das überhaupt nicht! – Arafangion

+0

super hilfreich, tx .. habe es nicht geschafft, eine Lösung für 'git log' noch zu finden – ptim

13

Die allgemeine Regel Schuld Geschichte aufrechtzuerhalten ist eine separate bewegen begehen, bevor irgendwelche Änderungen vornehmen. Es ist meine Erfahrung, dass dies ermöglicht git blame ohne die Option -C zu arbeiten. So im Fall der Aufteilung der Datei in neue Dateien auf, kann dies in zwei Commits erfolgen:

  1. das Original zu den neuen Zielen duplizieren, um sicherzustellen, das ursprüngliche
  2. Entfernen Sie die zusätzlichen Abschnitte aus der löschen duplizierten Dateien

In dem gegebenen Beispiel würde dies sein:

cp a.php b.php 
mv a.php c.php 
git add a.php b.php c.php 
git commit 
vim b.php # delete everything but 1 function 
vim c.php # delete the 1 function 
git add b.php c.php 
git commit 
+0

Das Verhalten von' git add' auf einer nicht vorhandenen Datei änderte sich irgendwann um Git 1.9. Sie benötigen entweder "git rm" oder "git add -A", um entfernte Dateien zu reflektieren. –

+0

Danke für den Kommentar @DamianYerrick. Ich glaube nicht, dass es auf die eine oder andere Weise wichtig sein sollte, wenn Sie die genauen Dateien für die Bühne angeben. (Die Änderung war, dass ab git 2.0, "git add ' ist das gleiche wie 'git add-A ' "in dem es Entnahmen gemäß den [Release Notes] (https: //git.kernel. org/cgit/git/git.git/plain/Dokumentation/RelNotes/2.0.0.txt)). – vine77