首先,我是一个 Git 的新手。就像,如果它在暂存区中击中我,我几乎分不清缓存和索引之间的区别。我的问题是这样的:
假设我想要开发一个项目,其代码风格需要使用空格进行缩进,但我喜欢使用制表符。看起来我可以使用 clean 和 smudge 功能,但有个问题。代码风格并没有一致地遵循,有些文件在同一行上混合使用了制表符和空格。因此,一种天真的方法会导致我只改变一行,但意外地创建了一个巨大的提交,将项目完全符合其自身标准。虽然这很好,但差异会变得不太有用,所以最终我会得到更多敌人。
那么问题是:是否有一种方式可以让它以这样的方式工作,即如果我不触及某个文件,它就不会出现在提交中?(即使我只更改了单个字符,我也愿意对我接触过的文件负责任。)
编辑:好的,我刚刚取消了昨天接受的答案。我非常确定这样做很粗鲁。我的借口是今天才测试它。由于显然已经有两个人误解了我的意思,所以让我明确一下我实际上做了什么,也许有人可以告诉我是否被困惑和/或混淆了。
假设我想要开发一个项目,其代码风格需要使用空格进行缩进,但我喜欢使用制表符。看起来我可以使用 clean 和 smudge 功能,但有个问题。代码风格并没有一致地遵循,有些文件在同一行上混合使用了制表符和空格。因此,一种天真的方法会导致我只改变一行,但意外地创建了一个巨大的提交,将项目完全符合其自身标准。虽然这很好,但差异会变得不太有用,所以最终我会得到更多敌人。
那么问题是:是否有一种方式可以让它以这样的方式工作,即如果我不触及某个文件,它就不会出现在提交中?(即使我只更改了单个字符,我也愿意对我接触过的文件负责任。)
编辑:好的,我刚刚取消了昨天接受的答案。我非常确定这样做很粗鲁。我的借口是今天才测试它。由于显然已经有两个人误解了我的意思,所以让我明确一下我实际上做了什么,也许有人可以告诉我是否被困惑和/或混淆了。
$ ls -a
. .. t.txt
$ hd t.txt # file contains 3 bytes: a tab, a capital A, and a newline
00000000 09 41 0a |.A.|
00000003
$ git init
Initialized empty Git repository in /home/marvy/test/.git/
$ git config --local git config --local user.name me
$ git config --local user.email me@example.com
$ git add t.txt
$ git commit
[master (root-commit) 959bf99] testing cleverness of git status
1 file changed, 1 insertion(+)
create mode 100644 t.txt
$ echo '*.txt filter=tabspace' > .git/info/attributes
$ cat .git/info/attributes
*.txt filter=tabspace
$ git config --local filter.tabspace.smudge unexpand
$ git config --local filter.tabspace.clean expand
$ rm t.txt
$ git checkout t.txt
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: t.txt
no changes added to commit (use "git add" and/or "git commit -a")
$ git help --stackoverflow
我们可以看到,git status报告t.txt已经被修改,即使我刚刚检出它。如果你运行git diff,它会声称我要将制表符转换为空格。我做错了什么吗?