首先,我是git的新手。就像,如果它在临时区域中击中我,我几乎无法从索引中告诉缓存。或类似的东西。除此之外,我的问题是:
假设我想处理一个项目,其编码风格要求缩进空间,但我喜欢标签。似乎我可以使用干净和涂抹功能,但有一个问题。编码样式不一致,并且有一些文件在同一行上混合制表符和空格。因此,一种天真的方法会导致我进行一线更改,但意外地创建了一个大规模的提交,使项目完全符合自己的标准。这将是很好的,除了差异不太有用,所以我最终有新的敌人。
所以问题是:有没有办法让这种魔法以这样的方式工作:如果我不触摸文件,它就不会出现? (即使我只更改了一个字符,我也愿意为我触摸的文件的空白承担全部责任。)
编辑:好的,我刚接受了我昨天接受的答案。我很确定这对我很粗鲁。我的理由是我今天才开始测试它。由于显然有两个人已经误解了我,让我清楚我实际上做了什么,所以也许有人可以告诉我,我是否感到困惑和/或混淆。$ 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,它会声称我想将标签转换为空格。我做错了吗?
答案 0 :(得分:3)
您可以使用预提交挂钩,仅循环浏览已编辑的文件,并用空格替换选项卡。如下所示:
FILES=`git status -s -uno | egrep '^M' | sed 's/^M//'`
for FILE in $FILES
do
(sed -i 's/[[:space:]]*$//' "$FILE" > /dev/null 2>&1 || sed -i '' -E 's/[[:space:]]*$//' "$FILE")
fi
答案 1 :(得分:2)
最好的方法是使用带有smudge-clean
的脚本。
smudge-clean
Smudge / Clean是在文件传递到舞台区域的任何地方运行的过滤器,这些过滤器将通过执行给定的脚本来修改文件。
使用涂抹和清洁将仅触摸您通过暂存区域的文件。
例如(unix示例):
如果您不熟悉uexpand/unuexpand
,请阅读相关内容
here
# filters to convert between tabs to spaces
[filter "tabspace"]
smudge = unexpand --tabs=2 --first-only
clean = expand --tabs=2 --initial
*.txt filter=tabspace
现在,只要您添加/签出文件,就会根据您的配置对其进行转换。
您还可以查看此project in github
答案 2 :(得分:1)
设置存储库:
做出重大改变: