从git中删除具有奇怪名称的文件
我有一个文件,它成功地将自己命名为:从git中删除具有奇怪名称的文件,git,Git,我有一个文件,它成功地将自己命名为: # file's name (both lines) companies.yml companies.yml # entry in my git working tree "test/fixtures/companies.yml\342\200\250companies.yml" 出于恼人的原因,这个特定项目的工作树中充满了仍然需要组织的其他文件。我想把上面的条目去掉,但是当我尝试添加“测试/装置…”时,git添加“测试/装置…”或g
# file's name (both lines)
companies.yml
companies.yml
# entry in my git working tree
"test/fixtures/companies.yml\342\200\250companies.yml"
出于恼人的原因,这个特定项目的工作树中充满了仍然需要组织的其他文件。我想把上面的条目去掉,但是当我尝试添加“测试/装置…”时,git添加“测试/装置…”
或git rm“测试/装置…”
失败:fatal:pathspec'test/fixtures/companys.yml\342\200\250companys.yml'与任何文件都不匹配
我该怎么处理
Git状态 分支主机上的
#您的分支机构比“生产/主控”领先4%。
#
#未为提交而暂存的更改:
#(使用“git add…”更新将提交的内容)
#(使用“git签出--…”放弃工作目录中的更改)
修改:[其他文件]
修改:“test/fixtures/companys.yml\342\200\250companys.yml”
Git正在打印文件名UTF-8编码的文字八位字节,因为它们是非ASCII字符,并将它们打印为八进制转义符。但是,您的shell不理解它们,并且在剪切和粘贴时向git命令发送文本反斜杠和数字,因此您实际上输入了不同的文件名
键入test/fixtures/companys.yml
(如果您的shell支持此操作)后使用制表符补全,这将输入实际字符或使用通配符代替转义符,因此test/fixtures/companys.yml*companys.yml
。后者可能(但可能不会)与其他文件名匹配
当然,另一种可能是将文件重命名为更合理的名称,然后使用
git add-u
/git add.
让git注意到重命名。既然您在bash中,您可以使用:
以\0开头的八进制转义最多可包含四位数字。(POSIX最多指定三个) 您可以在“”中看到类似的解决方案 这将从索引中删除文件,同时仍将其保留在工作树中。
如果需要,可以重命名它
使用Git 2.18(2018年第二季度,6年后)进行更新,使用简单的完成方式应该是可行的 见(2018年4月16日)作者 完成:支持完成非ASCII路径名 除非用户在 配置时,“
git ls文件”和“git diff index
”都将
默认情况下,引用包含值大于的字节的任何路径名
0x80
,并将这些字节转义为“\nnn
”八进制值。
这将阻止在当前路径组件完成时完成路径
包含任何非ASCII字符,尤其是UTF-8字符,因为没有
列出的带引号的路径将与命令上的当前单词匹配
线路
设置“<代码>核心.QuoTePix= false ”用于“<代码> Git ls文件”和'<代码> Git DIFQ索引调用,因此它们不会认为字节比0x80“不寻常”,不会引用包含此类字符的路径名。
请注意,路径名包含反斜杠、双引号或控件
字符仍将被引用;本系列的后续补丁将提供
处理这些问题
我想删除git存储库中的一个文件夹,该文件夹的名称包含俄语字母:“ФаааафMail.RuАааа”。首先,我手动删除了该文件夹,并希望在git中使用
git rm "..."
下一步中的命令。但git给我看了一个非常刻薄的被删除文件夹的名称:
“\320\244\320\260\320\271\320\273\321\213 Mail.Ru\320\220\320\263\320\265\320\275\321\202\320\260”。
我用恢复了文件夹
git checkout
而不仅仅是复制文件夹的名称并执行命令
git rm "Файлы Mail.Ru Агента/*"
成功了 我可以创建,git add
和git rm
一个具有该名称的文件,几乎没有任何问题。您在哪个平台上?git rm test/fixtures/companys.yml*(如果您没有与该模式匹配的其他文件)?使用通配符处理有问题的文件名是一个古老的传统。git checkout--test/fixtures…
do做什么?@larsmans-我在OS X上。@MichałPolitowski-我尝试过了,但文件不见了,但工作树仍然有“deleted”行项。我的shell中没有制表符完成,因此,我将Finder中的名称直接复制到git-rm“text/fixtures/[paste]”
。这成功了+1@sscirrus对该问题的完整解释和有效解决方案+我也从我的本地repo中删除了一个wordpress安装(上传时包含UTF8字符),并且git rm blog/*
创造了奇迹。谢谢谢谢@VonC。不错的解决方案,+1。我刚刚意识到这些解决方案只是将文件移动到要提交的更改中。这不是让我的工作树一个人呆着…@sscirrus我编辑了答案,以确保工作树不受影响。
git checkout
git rm "Файлы Mail.Ru Агента/*"