使用“文本”属性对文件进行规范化后,如何强制git检出master分支并删除回车符?


104

好了,所以我添加的文件.gitattributes有这样的线

*.css text
*.js text
etc...

然后,我按照http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in中的说明进行操作

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

但是现在我的工作副本仍然有回车的消息!我有要保留的未跟踪文件。git如何使用规范化文件再次检出master分支?

我知道文件在存储库中已标准化,因为克隆克隆存储库时,我拥有的所有文件都没有回车符。

Answers:


267

啊啊!检出上一个提交,然后检出主控。

git checkout HEAD^
git checkout -f master

5
感谢您提供此解决方法,但git中明显的问题是“ checkout -f”并没有真正强制重新签出。另一个解决方法是先删除所有工作副本文件(即除.git dir之外的所有文件)。
pfalcon 2014年

啊,是的,谢谢你!听说,我想我们可以删除感兴趣的文件并运行检出。对我来说,实际上只有一个文件要纠正。但是,当然可能是所有文件,成百上千个。
杰森

这在git 1.8.3(mac)上失败,错误:错误:pathspec'HEAD ^'与git已知的任何文件都不匹配。
dval 2014年

@dval,请查看这篇文章的编辑内容,您将看到一种替代方法。我也在Mac上运行,这对我有用。我也鼓励您将git升级到2+,然后可以使用Homebrew以安全可维护的方式进行此操作。
杰森

2
这实际上是行不通的。GIT将仅更新两次提交之间更改的文件(有一些例外)。如果存储库是全新的,例如。只有两次提交,而第一次恰好为空,则此解决方案将起作用。否则,您需要按照Mechsin的答案强制删除所有文件。
jstine

16

正如其他人指出的那样,您可以删除存储库中的所有文件,然后将其检出。我更喜欢这种方法,可以用下面的代码完成

git ls-files -z | xargs -0 rm
git checkout -- .

或一行

git ls-files -z | xargs -0 rm ; git checkout -- .

我一直在使用它,还没有发现任何缺点!

为了进一步说明,,在-z的每个条目末尾附加一个空字符ls-files,并-0告诉xargs以这些空字符分隔正在接收的输出。

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.