Git: изменить стиль (пробелы) без изменения владельца/вины?

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

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

Ответ 1

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

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

http://git-scm.com/docs/git-filter-branch

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

Ответ 2

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

git blame -w app/to/file.rb

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

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

с теми же результатами: D

Ответ 3

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

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 version and
+      # the child to find where the lines came from.
+      args << '-w'
       output = command("annotate", *args)
       if output.match(/^fatal:/)
         puts output 

Ответ 4

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

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

... и используйте его вместо git -blame:

git shame path/to/file

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