我正在尝试将' git rm -rf --cached。'与' git add。'一起运行,以删除现在列在中的缓存文件。 gitignore。我在Windows计算机上使用Visual Studio,并且更喜欢在这种情况下保留行尾。
我尝试使用git config命令将core.autocrlf设置为false。我尝试用行'* -text'创建一个.gitattributes,rm .git / index,然后运行 git reset 。到目前为止,每次我重新添加文件时,都会得到大量修改后的文件。
编辑:文件中的更改实际上不是行尾,而是我未请求的文件权限更改。
答案 0 :(得分:1)
编辑:剩下的问题是文件模式显然没有在Windows系统中正确存储(另请参见What is git's "filemode"?)。要保存和还原它们,将需要一个脚本以及原始数据:
git ls-files --stage > /tmp/original
要恢复模式,这个比较粗糙的管道应该可以工作:
< /tmp/original \
awk -F$'\t' '/^100755 / { print "git update-index --chmod=+x \"" $2 "\"" }' |
sh
这将尝试按以下顺序删除chmod +x
个文件,因此,如果有任何此类文件,可能会出现一些错误消息。 (它还假定没有文件名称中带有双引号。)
假设您还没有.gitattributes
文件,这是一个应该执行的六步过程:
.gitattributes
文件rm .git/index
git checkout HEAD -- .
git rm -r --cached .
git add .
git rm .gitattributes
(您可以在验证所有文件都有效之前将其保留)。之后运行git commit
。我没有(也没有使用过)Windows,因此无法对其进行测试,但是这是为什么它应该起作用以及为什么要执行这些步骤的背后原理。
Git的实际数据存储格式是一种特殊的,仅Git压缩的(有时是高度压缩的)格式。以这种格式存储的文件主要仅对Git本身有用。这种格式存储未解释的原始字节流:文件不必分为“文本”和“数据”等,它们只是原始字节流(因此被视为“数据” /“非文本”)。数据一旦存储,将成为只读数据并被分配一个哈希ID(当前SHA-1,尽管将来的Git可能会使用SHA-256)。 Git将以此方式存储的文件称为 blob ,即a term stolen from the database world。
您计算机的有用文件存储格式当然有所不同,并且可能(在Windows上也是如此)在“文本”和“数据”之间进行区分。文本可能具有编码(例如ISO-8859-1,UTF-8,UTF-16等)。这些文件通常都是可读可写的,并且您计算机上的任何文件都可以处理这些文件(无论如何在某种程度上取决于编码)。
Git必须从提交中提取文件,将它们从Blob转换为可以使用的文件。这些文件位于您的工作树中。您与他们合作,然后git add
与他们合作,使Git有机会重新blobize它们。
在这些特殊的仅Git的Blob和工作树之间,Git需要一个存储blobled数据的地方,与提交不同,它是可写的,但与提交一样,该文件已在特殊的Git中仅限格式。这个“中间”位置是Git的 index 。 Git文档的各个部分有时将其称为登台区域或缓存。
Git使用每个文件(或blob,实际上)的索引副本进行新的提交。当您运行git add
时,Git读取工作树文件,将其编码为blob形式,然后将它(实际上是其哈希ID)保存在索引中。运行git commit
时,Git只是将索引副本冻结为已提交副本。
当您运行git checkout
切换到某些提交时,Git会将提交提取到索引中(填写所有Blob哈希ID),还将Blob提取到工作树中,以使它们有用格式,您可以对其进行处理。当您运行git add
时,Git会将工作树文件压缩为其Blob格式,并替换该文件的索引条目。
将blob转换为工作树文件(反之亦然)是Git进行所需的任何转换(例如将换行符转换为CRLF行尾)的理想场所。因此,就是在 Git进行的工作:git checkout
填充索引,并将其扩展并转换为工作树,而git add
则对工作进行压缩和取消转换-tree进入索引,为下一个git commit
准备。 (任何您不触摸的文件,保持压缩状态并准备就绪,可以安全地存放在索引中。)
您已经知道跟踪的文件是索引中的文件,而未跟踪的文件是工作树中但不在索引中的文件。您的目标是使用现有的.gitignore
使 .gitignore
版的当前位于索引中的文件脱离索引。您正在使用的过程是:
git rm -r --cached .
:从索引中删除所有 ,这样整个工作树都不会被跟踪git add .
:根据工作树中的内容生成索引中的所有新blob,而忽略.gitignore
中列出的任何文件。这里的问题是工作树中的内容已由“ blob转换为工作树”转换,而将由“ work-tree转换为blob”转换为“未转换”。使用.gitattributes
创建一个* -text
文件会告诉Git:要进行的转换完全不是转换。”
不幸的是,为时已晚:您早些时候运行的git checkout
要将提交提交到工作树中,已经进行了一些转换。
因此,在这里,我们使用第1步创建一个.gitattributes
文件,该文件显示不进行转化。步骤2,rm .git/index
,将完全删除索引。 Git现在不知道工作树中到底有什么。此步骤可能是不必要的,但是我用它来迫使Git在步骤3中执行操作,该步骤告诉Git:从HEAD
提交中提取每个文件到索引和工作树中。重新创建索引,并重新填充工作树,这次进行 no 转换。
第4步和第5步与以前一样,但是这次,工作树文件都与HEAD
提交中的blob匹配,因为第3步使用了.gitattributes
指令进行了操作。步骤6是确保您不提交“不进行转化”指令。