git可以自动在空格和制表符之间切换吗?


196

我在python程序中使用制表符进行缩进,但是我想与使用空格的人进行协作(使用git)。

git是否有办法在推入/提取时自动在空格和制表符之间进行转换(例如4个空格= 1个制表符)?(类似于CR / LF转换)


33
PEP8正是我的问题。每个人都遵循它,而我被卡住了。我碰巧认为一个缩进=一个制表符是正确的事情(为什么要空格?为什么要四个空格?PEP8不能解释这一点...)。无论如何,有了这个git技巧,我可以很高兴地使用计算机上的标签,并与所有PEP8关注者共享我的代码。
Olivier Verdier'2

7
哦! 我使用TextMate,并且可以在空格之间切换到制表符。关键是,当我点击选项卡时,我希望编辑器编写...选项卡。因此,如果我签出带空格的python项目,则将插入所有选项卡。我必须手动转换为选项卡,但是当我签入时,看起来好像有1000个删除项,1000个添加项,而我的协作者将不满意。:-)
Olivier Verdier'2

6
PEP8指定空格而不是制表符的原因是由于连续缩进规则。有两种方法可以使圆括号内的行超长。如果在括号后立即开始新行,则只需缩进一个。如果您改为将括号内容的一部分放在第一行,则必须在下一行的开头括号的缩进级别处继续括号。如果您使用的选项卡不起作用。
John Christopher Jones

2
在这种情况下,@ JohnChristopherJones可以使用制表符将缩进与上一行匹配,然后使用空格与上一行的位置匹配。这可以轻松转换为空格。不幸的是,事实并非如此,因为它将缩进信息与对齐信息混合在一起。
帕特里克·帕克

Answers:


194

这是完整的解决方案:

在您的存储库中,添加一个文件.git/info/attributes,其中包含:

*.py  filter=tabspace

Linux / Unix

现在运行命令:

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

OS X

首先在brew中安装coreutils:

brew install coreutils

现在运行命令:

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

所有系统

现在,您可以签出项目的所有文件。您可以执行以下操作:

git checkout HEAD -- **

并且所有的python文件现在都将带有制表符而不是空格。

编辑:更改了强制结帐命令。当然,您应该首先提交您的工作。


1
干净的过滤器对我不起作用。当我做git add。我收到一条错误消息:“错误:外部过滤器扩展--tabs = 4-初始失败”。我在Windows上。这有什么区别吗?
杰里米·希克斯

2
@Jeremy:展开/展开是Unix命令。您要么必须找到Windows端口/等效端口,要么要使用Cygwin之类的
Tim Tim

1
我已经找到了有效的工作版本sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik 2011年

3
@Marc-André好点。我实际上使用coreutils版本。(安装homebrew,然后运行brew install coreutils)。
奥利维尔·韦迪耶

2
看来这不再起作用了,过滤器对我没有任何帮助。签出后,文件仍然有空格。这事有进一步更新吗?
菲利普·路德维希

141

是的,一种可能的解决方案是使用git属性过滤器驱动程序(另请参见GitPro书),以定义污迹/清除机制。

替代文字

那样:

  • 每次结帐回购中的某些文件时,都可以在标签中转换空格,
  • 但是当您签入(以及推送和发布)时,这些相同的文件仅使用空格存储回去。

您可以tabspace.git/info/attributes(适用于Git存储库中所有文件的过滤器)中声明此过滤器驱动程序(在此处命名为' '),其内容如下:

*.py  filter=tabspace

现在运行命令:

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

请参阅奥利维尔(Olivier)的答案,以获取此类污迹/清洁指令集的具体工作示例。


不幸的是,它根本不起作用。我按照所有说明进行操作,但是git不适用于装配工。:-(当我结帐时,没有应用污迹过滤器,当我结帐时,也没有任何反应... git有时是如此令人沮丧...
Olivier Verdier 2010年

@Olivier:奇怪,只要不小心限制属性过滤器的范围(仅限于特定的子树,仅针对特定类型的文件),我就不会有任何问题,以免减慢签出/签入的速度。进行中。例如,见stackoverflow.com/questions/62264/...
VonC

谢谢!现在可以了。看到完整的解决方案:stackoverflow.com/questions/2316677/...
奥利维尔迭尔

@Vonc:也许应该删除该--global标志,因为这意味着您要向每个协作项目发送空间...
Willem Van Onsem 2014年

@CommuSoft仅对具有权利的项目有效.gitattributes。但是,是的,更容易理解配置是否在本地存储库中。我已经编辑了答案。
2014年

39

对于使用GitHub(或其他类似服务)的每个人来说非常有用的信息

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

然后我有两个文件: attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

从事个人项目

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

这样,当您最终在github上进行工作时,它在代码视图中看起来并不傻,8 space tabs这在所有浏览器中都是默认行为。

为其他项目做贡献

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

这样,您就可以使用2 space indented项目上的常规选项卡。

当然4 space to 2 space,如果您想为我发布的项目做贡献,并且在开发过程中倾向于使用2个空格,那么您可以编写类似的解决方案以进行转换。


2
相关:将git config存储为存储库的一部分;还请注意,您可以.gitattributes在回购中使用(并提交)文件
Tobias Kienzler 2016年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.