制表符转换为空格 + GIT

3

我与其他几位开发者一起在一个项目上工作。并非所有人都使用相同的IDE。最近,我意识到代码的某些部分是用制表符缩进的,而另一些部分则是用空格缩进的。当使用tab = 4 spaces来显示代码时,一切看起来都很正常,但在其他设置下会变得非常混乱。

我们使用git作为版本控制系统。 有没有办法重新格式化整个代码库中的代码,提交这些更改,并以某种方式保留“责任信息”

3个回答

4
不,没有重写历史记录是不可能的。最简单且对开发人员友好的解决方案(虽然无法保留责任信息)是在单个提交中修复所有空格问题,然后配置git拒绝添加混合空格的提交。如果重写历史记录对您没有问题(例如,因为您可以要求所有开发人员放弃他们的本地分支并获取重写后的分支),则可以使用git filter-branch来修复所有提交中的空格。这将不会创建一个新的提交,并确保更改后的git blame显示正确的信息。

我认为你的回答与@AndrejsCainikovs的回答相辅相成,因为他的回答可以确保以“中立”的方式编写新历史记录,而你的回答则使“旧”历史记录符合新要求。重新编写历史以替换空格不应该太难,这些可以很容易地从diff中省略。 - Romain
重写历史总是不好的,除非你能让每一个克隆你仓库的用户执行完全相同的重写(如果你有一个脚本,并且他们只需要使用git-filter-branch调用它,那么这很容易),或者放弃基于旧历史的分支。 - ThiefMaster
你也可以指导他们获取新的内容,并巧妙地在其上进行变基。我们谈论的是空格变化...因此,这比我们谈论更大的变化要容易得多。 - Romain
我认为我可以重写历史。团队规模不是很大。但是,如果有人没有重写历史(或者没有再次克隆存储库)并尝试推送到源呢? - Kylo
除非他使用 --force 进行推送(在这种情况下,他将撤消远程仓库中的历史重写),否则他会收到一个错误。 - ThiefMaster

3

您可以编写自己的脚本,将制表符替换为所需数量的空格(在您的情况下为4个),并将其放置在.git/hooks/pre-commit中。


当然不会。你所提交的内容将会保留下来。但是你可以通过单独提交解决这个问题 :) - Andrejs Cainikovs
这就使得 git-blame 变得无用,除非你明确告诉它使用空格提交之前的任何版本 ;) - ThiefMaster
6
实际上,git blame 命令有一个 -w 选项可以忽略空格改动。 - Jakub Wieczorek
1
我可以将这些钩子设置在中央仓库中,以便它们随着更改被克隆/获取吗? - Kylo
很遗憾,不行。但是你可以创建一个钩子来检查接收到的提交是否引入了错误的空格,在这种情况下拒绝推送。 - ThiefMaster

0
一个简单的bash脚本可以将每个制表符替换为4个空格,但您必须在每次提交之前使用它...
或者,查看不同IDE的设置,以使用制表符而不是空格。我知道emacs可以做到。;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接