git: изменить стиль (пробел) без смены владельца / вины? - PullRequest
41 голосов
/ 06 ноября 2010

У нас есть массивная, древняя кодовая база, которая нуждается в большой очистке.У нас всегда были стандарты кодирования, и каждый всегда пытался им следовать, но они не применялись, поэтому со временем многие нарушения закрались. Многие из них - просто проблемы с пробелами, например использование табуляции вместо пробелов или пробелов, гдене должно быть ни одного, или пропущенных мест, где они должны быть.Мы собираемся начать активно применять наши стандарты кодирования, чтобы избежать появления новых нарушений, но их трудно автоматизировать только на изменениях, поэтому было бы неплохо очистить эти старые файлы.

Существуют инструменты, которые могут автоматизировать решение этих проблем, однако, если я это сделаю, то обвинение покажет мне, как владельца этих строк, хотя в действительности я, возможно, никогда даже не видел их.Я знаю, что есть настройка, позволяющая обвинять, игнорируя изменения пробелов, но я не могу заставить всех использовать обвинения одинаково, включая другие визуальные инструменты и такие вещи, как gitstats.В идеальном мире был бы какой-то способ переписать историю, чтобы выглядеть так, будто нарушения никогда не вводились, без прикрытия того, кто ввел реальный код, но я не могу найти ничего подобного.

Ответы [ 4 ]

36 голосов
/ 22 ноября 2010

Если вы пытаетесь получить причину первопричины, используя вину, не забудьте использовать флаг -w, чтобы игнорировать все пробелы или изменения отступов.Таким образом, вы получите последнее реальное изменение в коде, вместо отступа или удаления пробелов.

git blame -w app/to/file.rb

или просто используйте команду git slap ..

git config alias.slap "blame -w";
git slap app/path/to/file.rb

с одинаковыми результатами: D

20 голосов
/ 06 ноября 2010

В идеальном мире был бы какой-то способ переписать историю, чтобы выглядеть так, будто нарушения никогда не вводились

git filter-branch делает именно это.

http://git -scm.com / Docs / ГИТ-фильтр-филиал

Это имеет те же проблемы, что и все команды перезаписи истории, поскольку по сути делает недействительными все клонированные репозитории.

8 голосов
/ 29 июня 2017

Опираясь на Ответ Марио , я бы предложил git shame в качестве глобального псевдонима:

git config --global alias.shame 'blame -w -M'

... и использовал бы его вместо git-blame:

git shame path/to/file

Чтобы объяснить:
- -w Игнорирует изменения пробелов, чтобы не обвинять кого-то, кто заново сделал отступ в коде
- -M Обнаруживает строки, которые были перемещены или скопированы, и обвиняеторигинальный автор

1 голос
/ 17 декабря 2010

Я сделал запрос извлечения к TextMate git Bundle , чтобы установить этот параметр "-w" по умолчанию для команды "Просмотреть аннотированный файл (обвинение)". Спасибо Марио Зайзар, ты сделал мой день.

diff --git a/Support/lib/git.rb b/Support/lib/git.rb
index 5e8de13..5192953 100644
--- a/Support/lib/git.rb
+++ b/Support/lib/git.rb
@@ -307,6 +307,9 @@ module SCM
       file = make_local_path(file_path)
       args = [file]
       args << revision unless revision.nil? || revision.empty?
+      # Ignore whitespace when comparing the parent's version and
+      # the child's to find where the lines came from.
+      args << '-w'
       output = command("annotate", *args)
       if output.match(/^fatal:/)
         puts output 
...