Git:如何恢复对文件unicode的分段删除?

时间:2019-03-18 02:23:04

标签: git

enter image description here

如图所示,我删除了一个文件名,其中包含一些UniCode字符,并将其添加到索引中。如何取消该动作?

更多说明:

git status所示,我上演了已删除的文件。但是我还没有承诺。

通过git checkout -- deleteFile,它声称:

fatal: pathspec '03.08 T&D \347\224...' did not match any files.

通过`git rm --cached“ 03.08 T&D \ 347 \ 224 ...”声明:

fatal: pathspec '03.08 T&D \347\224...' did not match any files.

enter image description here

3 个答案:

答案 0 :(得分:2)

这里的问题是文件名包含Unicode序列,表示文件名中的非ASCII字符:

$ printf '%b\n' '03.08 T&D \347\224\260\346\235\260 WeeklyReport.md'
03.08 T&D 田杰 WeeklyReport.md

git status打印文件名时,不确定是否可以在屏幕上生成中文脚本,因此它会写出会生成田和杰的UTF-8序列的八进制值,而不是打印它们。 [编辑:,如果将core.quotePath设置为false,则告诉Git可以打印此类字符而不用转义符替换它们。见下文。]

上面的printf命令显示了一种表达文件名的方式,该方式允许您剪切和粘贴文件名。然后,您可以使用:

git checkout -- '03.08 T&D 田杰 WeeklyReport.md'

找回它。

git stash呢?

您使用的方法-运行git stash-等于根据您已进行的更改进行提交,然后运行git reset --hardgit stash所做的提交不在 any 分支上。运行git stash list将显示git stash所做的提交。您以后可以随便做什么。

从技术上讲,git stash实际上进行了两个 分支上的提交,但是在这种情况下,其中只有一个做任何有用的事情:它保存了文件的删除,以防您确实确实意味着要删除它。复制起来并不是很困难(您可以再次删除文件),因此您可以简单地删除存储:

git stash drop

只要其中没有其他有价值的东西。

使用core.quotePath

同样,我在这里没有您的存储库,因此我只能对文件做出自己的猜测。这是我所做的:

$ mkdir tmp/tpath; cd tmp/tpath; git init
Initialized empty Git repository in .../tmp/tpath/.git/
$ echo text > '03.08 T&D 田杰 WeeklyReport.md'
$ git add .
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   "03.08 T&D \347\224\260\346\235\260 WeeklyReport.md"

$ git config core.quotePath false
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   03.08 T&D 田杰 WeeklyReport.md

$ git commit -m initial
[master (root-commit) 5658907] initial
 1 file changed, 1 insertion(+)
 create mode 100644 03.08 T&D 田杰 WeeklyReport.md

如果您使用的是Windows或MacOS,请注意,某些UTF-8文件名可能会遇到各种翻译问题,类似于Linux用户可以创建两个分别名为readme和{ {1}}并提交它们。如果您从不从Windows或MacOS系统迁移至 Linux,反之亦然,那么您就不会遇到问题,但是如果这样做,您可能会遇到问题。 (在READMEagréable之类的文件名中带重音符号的字符通常是一个问题。Unicode有多种方式来拼写这些名称,但是MacOS特别要坚持将其拼写为 方式。)

答案 1 :(得分:1)

git checkout HEAD -- <filepath>

应该可以

答案 2 :(得分:0)

不知道原因。但是我通过

解决了它
git stash

感谢您的回答。