我从一个存储库把一个项目克隆到我的电脑上,并得到了一些错误,因为一些文件的文件名中有星号,这显然不能在Windows系统上存在。所以现在我的git status显示我正在删除那些文件,因为它们没有复制到我的项目中。我不需要对这些文件做任何更改(它们都是图像),那么有没有办法告诉git不要对这些特定文件进行任何更改(在本例中是具体删除)?
我试过对其中一个文件执行git update-index --assume-unchanged操作,但似乎没有成功,因为我的git status仍然显示文件排队等待删除(与图片相关)。
git - 推送时如何忽略对特定文件的所有更改-LMLPHP

最佳答案

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/

10-14 23:53
查看更多