Angenommen, ich habe eine Textdatei
alex
bob
matrix
will be removed
git repo
und ich habe es aktualisiert, um zu sein
alex
new line here
another new line
bob
matrix
git
Hier habe ich die Zeilennummer (2,3) hinzugefügt und die Zeilennummer (6) aktualisiert.
Wie kann ich diese Zeilennummerninformationen mit git diff oder einem anderen git-Befehl abrufen?
Hier ist eine Bash-Funktion zum Berechnen der resultierenden Zeilennummern aus einem Diff:
diff-lines() { local path= local line= while read; do esc=$'\033' if [[ $REPLY =~ ---\ (a/)?.* ]]; then continue elif [[ $REPLY =~ \+\+\+\ (b/)?([^[:blank:]$esc]+).* ]]; then path=${BASH_REMATCH[2]} elif [[ $REPLY =~ @@\ -[0-9]+(,[0-9]+)?\ \+([0-9]+)(,[0-9]+)?\ @@.* ]]; then line=${BASH_REMATCH[2]} elif [[ $REPLY =~ ^($esc\[[0-9;]+m)*([\ +-]) ]]; then echo "$path:$line:$REPLY" if [[ ${BASH_REMATCH[2]} != - ]]; then ((line++)) fi fi done }
Es kann Ausgabe erzeugen wie:
von einem Diff wie diesem:
Wenn Sie nur hinzugefügte / entfernte / geänderte Zeilen und nicht den umgebenden Kontext
-U0
anzeigen möchten, können Sie an git diff übergeben:Es ist robust gegenüber ANSI-Farbcodes, sodass Sie
--color=always
an git diff übergeben können, um die übliche Farbcodierung für hinzugefügte / entfernte Zeilen zu erhalten.Die Ausgabe kann leicht erfasst werden:
In Ihrem Fall
git diff -U0
würde geben:Wenn Sie nur die Zeilennummern möchten, ändern Sie die
echo "$path:$line:$REPLY"
in justecho "$line"
und leiten Sie die Ausgabe durchuniq
.quelle
git diff --color
kommen, kommen nicht durch. Oder denkst du, es wäre besser, nur die Farbfluchten in die Rückkehr von dieser Funktion einzufügen?git diff --color | diff-lines
funktioniert jetzt wie erwartet :)zsh: parse error near `]+m'
Irgendwelche Ideen? Der Fehler kommt von dieser Zeile:elif [[ $REPLY =~ ^($esc\[[0-9;]+m)*([\ +-]) ]]; then
Ich benutze die
--unified=0
Option vongit diff
.Gibt beispielsweise
git diff --unified=0 commit1 commit2
das Diff aus:Aufgrund der
--unified=0
Option zeigt die Diff-Ausgabe 0 Kontextzeilen an. Mit anderen Worten, es werden genau die geänderten Zeilen angezeigt .Jetzt können Sie die Zeilen identifizieren, die mit '@@' beginnen, und sie anhand des Musters analysieren:
@@ -startline1,count1 +startline2,count2 @@
Zurück zum obigen Beispiel: Beginnen Sie für die Datei WildcardBinding.java ab Zeile 910, 0 Zeilen werden gelöscht. Ab Zeile 911 werden 4 Zeilen hinzugefügt.
quelle
@@ -910,10,+911,15@@
oder so, wie sagen wir dann genau, wie viele Zeilen hinzugefügt, gelöscht oder geändert wurdenIch hatte das gleiche Problem, also schrieb ich ein Gawk-Skript, das die Ausgabe von Git Diff ändert, um die Zeilennummer für jede Zeile voranzustellen. Ich finde es manchmal nützlich, wenn ich einen Arbeitsbaum unterscheiden muss, obwohl es nicht darauf beschränkt ist. Vielleicht ist es für jemanden hier nützlich?
Sie können es hier herunterladen:
https://github.com/jay/showlinenum
quelle
git diffn
, um dies zu tun, und es behält die Terminalfarben vollständig bei und zeigt die Zeilennummern sowohl der alten Datei links als auch der neuen Datei rechts.Zeilennummern aller nicht festgeschriebenen Zeilen (hinzugefügt / geändert):
Beispielausgabe:
quelle
Konfigurieren Sie ein externes Diff-Tool, das Ihnen die Zeilennummern anzeigt. Zum Beispiel ist dies das, was ich in meiner globalen Git-Konfiguration habe:
Weitere Informationen finden Sie in dieser Antwort: https://stackoverflow.com/q/949242/526535
quelle
Hier ist eine Bash-Funktion, die ich zusammengeschustert habe:
Und am Ende sieht es so aus:
quelle
Dies ist wahrscheinlich eine ziemlich genaue Anzahl geänderter Zeilen:
Hier ist auch eine Lösung für Zeilennummern in Ihrem Diff: https://github.com/jay/showlinenum
quelle
Nicht genau das, wonach Sie gefragt haben,
git blame TEXTFILE
kann aber helfen.quelle
Sie können
git diff
gekoppelt mitshortstat
Parameter verwenden, um nur die Anzahl der geänderten Zeilen anzuzeigen.Für die Anzahl der Zeilen, die seit Ihrem letzten Commit geändert wurden (in einer Datei, die sich bereits im Repo befindet)
Es wird etwas Ähnliches ausgeben wie
quelle
Ich suchte nach einer Möglichkeit, nur die für jede Datei geänderten Zeilen mit git diff auszugeben. Meine Idee war es, diese Ausgabe einem Linter zur Typprüfung zuzuführen. Das hat mir geholfen
quelle
Hier sind einige Python-Copypasta, um die Zeilennummern für geänderte / entfernte Zeilen abzurufen, falls Sie auf diese Frage gestoßen sind.
Es sollte ziemlich einfach sein, es in etwas zu ändern, das auch die geänderten und hinzugefügten Zeilennummern erhält.
Ich habe nur unter Windows getestet, aber es sollte auch plattformübergreifend sein.
import re import subprocess def main(file1: str, file2: str): diff = get_git_diff(file1, file2) print(edited_lines(diff)) def edited_lines(git_diff: str): ans = [] diff_lines = git_diff.split("\n") found_first = False # adjust for added lines adjust = 0 # how many lines since the start count = 0 for line in diff_lines: if found_first: count += 1 if line.startswith('-'): # minus one because count is 1 when we're looking at the start line ans.append(start + count - adjust - 1) continue if line.startswith('+'): adjust += 1 continue # get the start line match = re.fullmatch(r'@@ \-(\d+),\d+ \+\d+,\d+ @@', line) if match: start = int(match.group(1)) count = 0 adjust = 0 found_first = True return ans def get_git_diff(file1: str, file2: str): try: diff_process: subprocess.CompletedProcess = subprocess.run(['git', 'diff', '--no-index', '-u', file1, file2], shell=True, check=True, stdout=subprocess.PIPE) ans = diff_process.stdout # git may exit with 1 even though it worked except subprocess.CalledProcessError as e: if e.stdout and e.stderr is None: ans = e.stdout else: raise # remove carriage at the end of lines from Windows ans = ans.decode() ans.replace('\r', '') return ans if __name__ == "__main__": main("file1.txt", "file2.txt")
quelle