我从一个存储库把一个项目克隆到我的电脑上,并得到了一些错误,因为一些文件的文件名中有星号,这显然不能在Windows系统上存在。所以现在我的git status
显示我正在删除那些文件,因为它们没有复制到我的项目中。我不需要对这些文件做任何更改(它们都是图像),那么有没有办法告诉git不要对这些特定文件进行任何更改(在本例中是具体删除)?
我试过对其中一个文件执行git update-index --assume-unchanged
操作,但似乎没有成功,因为我的git status
仍然显示文件排队等待删除(与图片相关)。
最佳答案
TL;博士
为索引中的特定路径设置--skip-worktree
位:
git ls-files -dz | xargs -0 git update-index --skip-worktree
(我假设你的windows bash已经
xargs -0
;如果没有,你可能需要处理一下这个问题。)长(浅)
您的
git update-index
命令没有产生错误,因此它不会影响这些文件,这意味着您找错地方了。这里的一个基本问题是
git push
不推送文件。相反,它推送提交。提交确实包含文件,所以您可能会认为这是一个无用的区别,但这是git所做的一个关键区别,它是问题和解决方法的核心。…有几个文件在文件名中有星号,这显然不能在Windows系统上存在。
这似乎是正确的(What characters are forbidden in Windows and Linux directory names?)。从某种意义上说,它不会影响或困扰git,因为git处理的是提交,而不是文件。它影响你。:-)
git将提交存储在其存储库数据库中。git还将每个文件的每个版本存储在此数据库中。每个存储项在内部称为对象,都有一个特殊的、压缩的、仅限git的表单。只要提交存在(通常是永久的),提交中的文件将被冻结,只要1。
冻结(只读),git文件对您和计算机上的其他程序都没有用处。因此git需要一种方法将它们提取成读/写的有用形式。它分两个阶段来完成:首先,它通过在索引中列出文件(实际上只是一个名为
.git/index
的文件)来有效地解冻文件。索引跟踪工作树中的内容或至少应该包含的内容。然后在实际的文件系统中对它们进行反压缩,并为它们提供有用的名称真实的文件名,并将它们放入您的工作树中。这是最后一步,将解冻但仍仅限于git的索引项转换为
foo*bar
这样的文件名,但由于禁止使用该名称而失败。所以解冻的条目在索引中,但不在工作树中。git总是从索引中的任何内容进行新的提交。即使像
git commit -a
这样的命令也只是更新索引,然后从索引中构建提交(虽然有些人在提交期间只使用临时辅助索引,然后修复实际索引)。因此,在更改索引中文件的副本之前,您对工作树所做的任何操作(包括删除文件)或Git认为要删除的内容(因为文件从未创建)都只是一个更改,用git status
的术语来说,这只是不准备提交的更改。不过,我们希望避免
git status
抱怨,避免git add
删除文件的索引副本。也就是说,如果有一个文件foo*bar
,它没有进入我们的工作树,那就可以了,只要我们不想对该文件做任何事情。我们可以将文件保留在索引中,从工作树中丢失,并让每个新的git commit
重新冻结索引副本。我们不得不蹑手蹑脚地绕过工作树中没有foo*bar
的事实,这真是令人恼火。两个索引标志
--assume-unchanged
和--skip-worktree
,让我们解决这个问题。--skip-worktree
是用于此目的的标志:git人员将其添加为“稀疏签出”,这是稀疏签出的特例。因此,我们可以找到git status
将考虑从工作树中删除的文件列表,即索引中列出的文件,实际工作树中缺少的文件,并且没有在索引中设置特殊标志并设置--skip-worktree
标志。git ls-files -d
打印此类文件名的列表。使用-z
,它打印以ascii nul(\0
)字符而不是换行符结尾的字符。xargs -0
命令读取这些以nul结尾的字符串并对其运行git update-index --skip-worktree
,因此现在所有这些索引项都设置了标志。新提交将包含文件(因为索引列出了它们),但工作树不会(因为它不能);同时git add
不会尝试删除它们,并且git status
不会抱怨它们。1这实际上是一般规则的一部分:git的内部对象存在于一个密钥值存储区中,该密钥值存储区由散列ID的密钥寻址,任何对象的散列ID都是对象内容的唯一加密校验和。无法更改内容,因为如果更改了内容,校验和将更改,之后旧密钥仍将检索旧对象,只有新密钥/哈希ID才能检索新对象。
关于git - 推送时如何忽略对特定文件的所有更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53527830/