如何在不改变空格的情况下从存储库中移除在.gitignore中列出的文件

6
我阅读了这里的git命令教程:Remove directory from remote repository after adding them to .gitignore,以了解如何从存储库中删除在忽略文件中的文件。
我使用Azure DevOps中的Visual Studio 2019存储库,并采取了以下步骤:
  1. 从Git浏览器菜单中选择“在命令提示符中打开”
  2. git rm -r --cached . 这告诉git停止跟踪所有内容,现在我的所有文件都显示为“已删除”在“已暂存更改”中,而较少的文件则显示为“已添加”的“更改”。看起来不错。我认为被忽略的文件不会再次添加,因此当我提交这些添加时,原本应该被忽略的所有文件都将在服务器上被删除。
  3. 暂存。现在出现了问题。添加的文件显示为“已修改”。
  4. 推送以查看在浏览器中查看更改时它们的样子:“仅显示前999个更改。点击此处以加载更多”。我可以看到的每个文件都有一个警告:“文件只在空格上有所不同”。

我猜测这是关于行尾的问题,但它几乎使得审查更改变得不可能。有没有办法在使用此过程时停止空格更改?或者反转空格更改?或告诉git仅检查删除?

简短回答来自VonC):

git rm -r --cached .
git config --global core.autocrlf false
git add --renormalize .
git add .
git commit

“暂存文件”意味着“确保文件(以某种特定形式)存在于下一次提交中”。如果您的目标是从下一次提交中“删除”该文件,为什么还要再次将其暂存?(这可能是VS2019强加给用户的某种愚蠢;GUI因强加错误决策而臭名昭著。) - torek
@torek 这是 git 命令 git rm -r --cached . 的结果,与 VS2019 没有关系。从索引中删除所有文件,然后使用 git add . 将它们添加回去(以便遵守 .gitignore 配置)似乎是修复存储库的常见方法。我的问题是这样会引入空格更改。 - Colin
1
删除文件并不能“修复”存储库。它也不会“破坏”存储库。这只意味着下一个您进行的提交将缺少这些文件。就是这样 - 存储库中只有一系列提交。每个提交都有它所包含的文件,仅此而已。存储库只是一组提交的集合,每个提交都包含一些文件和一些元数据。 - torek
1
你似乎正在处理通常被称为XY问题的情况:你想完成某件事,并且认为git rm --cached,然后是git add,最后是git commit可以完成这件事。但你没有说出这个“某件事”是什么,而且显然这种解决方案并不能真正解决问题... - torek
如果您查看 git diff -wgit diff,更改是否会消失? - ti7
显示剩余8条评论
2个回答

7

阶段。现在看起来有一个问题。添加的文件正在显示为已修改。

重复相同的过程,但在第三步(提交),之前添加:

git config --global core.autocrlf false

这将确保自动进行行结束符(eol)转换。
尝试使用git add .(或git add --renormalize .(在Git 2.16+中)),然后再使用git status,看是否仍显示所有内容都已修改。

OP Colin评论中确认以下操作是有效的:

git config --global core.autocrlf false
git add --renormalize .
git add .

在执行了 git config --global core.autocrlf false 命令之后,git add . 的使用是一个重大的改进 - 它仍然会修改 js、html、php、asp、txt、pubxml、svg、css、scss 文件,但相比之前,它不再修改所有文件。 - Colin
但是执行 git add --renormalize . 后再执行 git add . 就可以完成任务了。非常感谢。 - Colin
另一个想法 - 我在这里更改了一个全局配置设置。这是否会有任何持续的影响?现在练习完成了,我应该改回去吗? - Colin
1
@Colin 如果你愿意的话,但这是一个我建议保留的全局配置,所以保留它并不是一个坏主意。例如,请参见 https://dev59.com/92ULtIcB2Jgan1zngUAM#68265163。 - VonC

0

我认为你把这件事情搞得比必要的还要复杂。要从git中删除文件,只需要执行以下操作:

git rm <files>
git add .
git commit

<files>替换为您想要删除的文件名称。您可以使用标准的glob语法来匹配多个文件。

这将删除先前提交的文件。没有理由使用--cached或任何与autocrlf有关的内容。这只会使问题更加复杂。


我想根据.gitignore文件中的规则删除文件。我担心这个答案没有抓住问题的重点。 - Colin
@Colin 好的,我现在明白你的意思了。我最初以为你是指一些你想要保留在文件系统中但又不想在 git 中追踪的文件。 - Code-Apprentice
@Colin 我已经更新了我的回答。我完全不明白空格与你的问题有什么关系。从git中删除文件不应该像你试图让它变得那么复杂。我看不出使用--cached或任何其他标志的理由。 - Code-Apprentice
1
是的,文件已经提交了。我想从存储库中删除.gitignore指定的文件,而且我不想逐个文件夹地进行操作。因此,git rm <files>并不能满足我的需求,因为我需要手动指定<files>。 我对暂存文件感兴趣,因为rm操作的结果是将文件标记为已删除状态。 我关注空格的原因是,如果我从索引中删除文件并再次添加它,git会更改行尾。 - Colin
我真的不知道 --cached(仅从索引中删除,而不是工作树)标志是否必要。但 -r 标志需要递归文件夹。 - Colin
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接