【问题标题】:Can git automatically switch between spaces and tabs?git可以自动在空格和制表符之间切换吗?
【发布时间】:2011-01-19 23:24:21
【问题描述】:

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

git 有没有办法在推送/获取时自动在空格和制表符之间转换(例如,4 个空格 = 1 个制表符)? (类似于 CR/LF 转换)

【问题讨论】:

  • PEP8 正是我的问题。每个人都跟着它,我被我的标签卡住了。我碰巧认为 一个缩进 = 一个制表符 是正确的做法(为什么要空格?为什么要 4 个空格?PEP8 没有解释...)。无论如何,通过这个 git 技巧,我可以愉快地在我的计算机上使用选项卡并与所有 PEP8 关注者分享我的代码。
  • 哦!我使用 TextMate,我可以在空格之间转换为制表符。问题是,当我点击制表符时,我喜欢我的编辑器编写...制表符。因此,如果我签出带有空格的 python 项目,我将插入各种选项卡。我必须手动转换为标签,但是当我签入时,它看起来像 1000 个删除,1000 个添加,我的合作者会不高兴。 :-)
  • PEP8 指定空格而不是制表符的原因是因为连续缩进规则。有两种方法可以在括号内继续过长的行。如果您在括号后立即开始新行,您只需缩进一个。如果您将括号的部分内容放在第一行,那么您必须在下一行的左括号的缩进级别继续括号。如果您使用不起作用的标签。
  • @JohnChristopherJones 对于这种情况,可以使用制表符将缩进与上一行匹配,然后使用空格匹配上一行中的位置。这可以很容易地转换为空格。不幸的是,相反的情况并非如此,因为它将缩进信息与对齐信息混合在一起。

标签: git tabs indentation


【解决方案1】:

是的,一种可能的解决方案是使用git attribute filter driver(另请参阅GitPro book)来定义涂抹/清洁机制。

这样:

  • 每次签出您的 repo 的某些文件时,都可以在制表符中转换空格,
  • 但是当您签入(以及推送和发布)时,这些相同的文件仅使用空格存储回来。

您可以在.git/info/attributes 中声明此过滤器驱动程序(此处命名为“tabspace”)(适用于应用于 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'

请参阅Olivieranswer,了解此类涂抹/清洁指令集的具体工作示例。

【讨论】:

  • 不幸的是,它不起作用。我遵循了所有的说明,但 git 没有应用 fiter。 :-( 当我结帐时,没有应用污迹过滤器,当我签入时,也没有任何反应... git 有时令人沮丧...
  • @Olivier: 奇怪,我从来没有遇到过任何问题,只要我小心地限制属性过滤器的范围(到特定的子树,仅针对特定类型的文件),以便不要减慢结帐/入住过程。参见例如stackoverflow.com/questions/62264/…
  • 谢谢!现在它起作用了。查看完整解决方案:stackoverflow.com/questions/2316677/…
  • @Vonc:也许应该删除--global 标志,因为这意味着您向每个协作项目发送空间...
  • @CommuSoft 仅适用于拥有.gitattributes 权限的项目。但是,是的,如果配置保留在存储库的本地,则更容易理解。我已经编辑了答案。
【解决方案2】:

这里是完整的解决方案:

在您的存储库中,添加一个文件 .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 文件现在都将有制表符而不是空格。

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

【讨论】:

  • 清洁过滤器对我不起作用。当我做 git add 。我收到一条错误消息,提示“错误:外部过滤器展开 --tabs=4 --initial failed”。我在 Windows 上。这有什么不同吗?
  • @Jeremy:expand/unexpand 是 unix 命令。您要么必须找到 Windows 端口/等效项,要么使用 Cygwin 之类的东西
  • @Marc-André 好点。我实际上使用 coreutils 版本。 (安装homebrew,然后运行brew install coreutils)。
  • 这似乎不再起作用了,过滤器对我没有任何作用。结帐后,文件仍然有空格。这有什么更新吗?
【解决方案3】:

对使用 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 个空格。

【讨论】:

【解决方案4】:

如果您使用的是 Windows,那么您还有一些额外的步骤可以让 @Olivier Verdier's 解决方案发挥作用。

  1. 下载CoreUtils for windows
  2. 安装后将安装位置放入您的 PATH (How to add a path variable)
  3. 我将 expand.exe 重命名为 gexpand.exe,因为已经有一个 windows 扩展实用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多