Предполагая, что у меня есть текстовый файл
alex
bob
matrix
will be removed
git repo
и я обновил его до
alex
new line here
another new line
bob
matrix
git
Здесь я добавил номер строки (2,3) и обновил номер строки (6).
Как я могу получить информацию об этих номерах строк с помощью git diff или любой другой команды git?
Вот функция bash для вычисления результирующих номеров строк из сравнения:
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 }
Он может производить такие выходные данные, как:
из такого различия:
Если вы хотите отображать только добавленные / удаленные / измененные строки, а не окружающий контекст, вы можете перейти
-U0
к git diff:Он устойчив к цветовым кодам ANSI, поэтому вы можете перейти
--color=always
к git diff, чтобы получить обычную цветовую кодировку для добавленных / удаленных строк.Вывод можно легко найти:
В вашем случае
git diff -U0
даст:Если вам просто нужны номера строк, измените значение
echo "$path:$line:$REPLY"
на justecho "$line"
и направьте вывод через конвейерuniq
.источник
git diff --color
не проходит. Или вы думаете, что было бы лучше просто добавить экранирование цвета в возврат из этой функции?git diff --color | diff-lines
теперь работает как положено :)zsh: parse error near `]+m'
Любые идеи? Ошибка происходит из этой строки:elif [[ $REPLY =~ ^($esc\[[0-9;]+m)*([\ +-]) ]]; then
Пользуюсь
--unified=0
опциейgit diff
.Например,
git diff --unified=0 commit1 commit2
вывод diff:Из-за этой
--unified=0
опции вывод diff показывает 0 строк контекста; другими словами, он показывает в точности измененные строки .Теперь вы можете определить строки, начинающиеся с '@@', и проанализировать их на основе шаблона:
@@ -startline1,count1 +startline2,count2 @@
Возвращаясь к приведенному выше примеру, для файла WildcardBinding.java, начиная со строки 910, удаляются 0 строк. Начиная со строки 911, добавляются 4 строки.
источник
@@ -910,10,+911,15@@
или что-то в этом роде, тогда как мы можем точно сказать, сколько строк добавлено, удалено или измененоУ меня была такая же проблема, поэтому я написал сценарий gawk, который изменяет вывод git diff, добавляя номер строки для каждой строки. Иногда я нахожу это полезным, когда мне нужно различать рабочее дерево, хотя это не ограничивается этим. Может здесь кому-нибудь пригодится?
Вы можете скачать его здесь:
https://github.com/jay/showlinenum
источник
git diffn
для этого, и он полностью сохраняет цвета терминала и показывает номера строк как старого файла слева, так и нового файла справа.Номера строк всех незафиксированных строк (добавлены / изменены):
Пример вывода:
источник
Настройте внешний инструмент сравнения, который покажет вам номера строк. Например, это то, что у меня есть в моей глобальной конфигурации git:
Подробнее см. Этот ответ: https://stackoverflow.com/q/949242/526535
источник
Вот функция bash, которую я сколотил:
В итоге это выглядит так:
источник
Вероятно, это довольно точное количество измененных строк:
Кроме того, вот решение для номеров строк в вашем diff: https://github.com/jay/showlinenum
источник
Не совсем то, о чем вы просили, но
git blame TEXTFILE
может помочь.источник
Вы можете использовать параметр
git diff
вместе сshortstat
параметром, чтобы просто показать количество измененных строк.Если количество строк не изменилось (в файле, который уже находится в репо) с момента вашей последней фиксации
Будет выведено что-то похожее на
источник
Я искал способ вывести только строки, измененные для каждого файла, с помощью git diff. Моя идея заключалась в том, чтобы передать этот вывод в линтер для проверки типов. Вот что мне помогло
источник
Вот несколько копий Python, чтобы получить номера строк для измененных / удаленных строк, если вы столкнулись с этим вопросом в поисках этого.
Его должно быть довольно легко изменить во что-то, что также будет иметь измененные и добавленные номера строк.
Я тестировал только Windows, но он также должен быть кросс-платформенным.
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")
источник