Git在标签和空格之间进行转换,但有时仅在

时间:2017-06-27 00:41:27

标签: git whitespace

首先,我是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,它会声称我想将标签转换为空格。我做错了吗?

3 个答案:

答案 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

〜/的.gitconfig

# filters to convert between tabs to spaces
[filter "tabspace"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

〜/ .gitattributes

*.txt  filter=tabspace

现在,只要您添加/签出文件,就会根据您的配置对其进行转换。

您还可以查看此project in github

答案 2 :(得分:1)

设置存储库:

  1. 获取存储库。
  2. 合并到当地的主分支机构。
  3. 做出重大改变:

    1. 如果您愿意,可以更改整个存储库。做你想做的事情和你需要做的事情。做一行更改,改变一切。但只能将您自己触及的文件添加到“临时区域”。换句话说,您必须手动添加这些文件:git add FilesYouWantToAdd.txt以及您负责的任何其他文件。不要将您不负责的文件添加到临时区域。

      git commit -m'将空格改为制表符'//仅添加您负责的文件。

      git push

    2. 你已经完成了。

      放弃其他更改:

      因为其余文件中没有任何重大内容发生变化,您可以直接放弃这些更改。

      git reset HEAD .
      

      实际上非常简单。希望这会有所帮助。

      修改 git modified