我有一个明显的印象,我的Git回购会被某种方式破坏。
这是我正在做的序列:
git clone [remote的克隆字符串]
这创建了一个文件“App / android / AndroidManifest.xml”
git mv App / android / AndroidManifest.xml App / android / AndroidManifestTemplate.xml
这会显示错误消息“致命:不受版本控制,源= App / And ......”
最初我认为这可能是gitignore的事情,但那也不是。我试过git fsck,它没有报告任何内容。
有关如何修复的建议吗?
答案 0 :(得分:8)
可能App/android/AndroidManifest.xml
确实存在,但是有不同的情况(例如App/android/androidmanifest.xml
,这意味着App/android/AndroidManifest.xml
没有版本化(因此错误消息):
使用正确的案例做git mv
就足够了。
发生的事情是Git中有两个文件夹,“
App
”和“app
”。
当我在Windows下检出repo时,由于Windows不区分大小写,它实际上将两个文件夹叠加到一个“App
”中。 这意味着,目录结构很好,但是一半的文件(来自“app
”的文件)有一个无效的Git路径!
答案 1 :(得分:2)
另一个令我沮丧的怪癖是,如果您使用命令行,它将使用您的当前路径来git mv
文件。因此,如果您在C:\Git\MyRepo\MyFolder\MyFile.txt
如果您这样做:
c:
cd git
cd myrepo
cd myfolder
dir
它将正常工作,您将看到您的文件。但是,如果您输入git mv MyFile.txt MyFile2.txt
,则会因为git找不到Myfile.txt而报错。
原因是它正在查看您当前的路径,即c:\git\myrepo\myfolder\
但是git区分大小写。因此,您必须返回并输入
c:
cd Git
cd MyRepo
cd MyFolder
如果您再输入git mv,它将正常工作。
将其作为对像我这样的人的答案,这些人在调试此错误消息时发现了这篇文章。
答案 2 :(得分:0)
以上所有答案都很不错,我在尝试移动文件时发现了这一点,并在同一次提交期间将它们大写
通过提交新的文件路径,我可以访问新路径,然后访问git mv
(:
问题解决了
答案 3 :(得分:0)
由于git区分大小写,但操作系统不区分大小写,因此git认为该路径实际上存在不同的大写字母时是错误的。
解决此问题的一种编程方式可以是从操作系统中删除冲突路径,然后执行git reset --hard HEAD
或从HEAD检出目录。
答案 4 :(得分:0)
答案 5 :(得分:0)
今天遇到了这个问题。就我而言,它似乎是导致此问题的路径中的反斜杠。
我试图像这样在 cmd
中重命名我的文件:
cd C:\Path\To\My\File
git mv file1.js file1.ts
这给了我这个 Not under version control
错误。
一旦我切换到 git bash
而不是 cmd
并开始使用类似 linux 的正斜杠它工作正常。
答案 6 :(得分:-1)
如currently chosen answer中所述,OP遇到的情况是由2个已有的文件夹(或文件名)引起的,它们具有相同的拼写但大小写不同。首先,这是一个不好的命名选择,希望不会经常发生。
在这里,为了完整起见,当您在Windows上使用 git bash 时,如果未使用精确正确的名称指定旧文件名,也会出现相同的“不在版本控制下”错误消息情况。
示例:
假设您的存储库中有一个文件路径包含大小写混合的Dir/MyVeryLongFileName.txt
,并且git将以区分大小写的方式存储其文件路径。
现在,您输入git mv dir/MyV
Tab 。假设您没有对路径dir
使用TAB自动完成功能,可能是因为它足够短,无法键入,并且您没有注意到您错误地将其首字母键入为d
而不是{{ 1}}。
由于Windows不区分大小写,因此TAB自动补全仍然有效,因此您现在可以在命令行中使用它
D
现在您要完成命令,BOOM,您会收到错误消息:
$ git mv dir/MyVeryLongFileName.txt
实际上,如果您使用相同的样式来键入$ git mv dir/MyVeryLongFileName.txt somewhere/else/
fatal: not under version control, source=dir/MyVeryLongFileName.txt, destination=somewhere/else/MyVeryLongFileName.txt
Tab 进行调查,则bash会告诉您存在旧文件(尽管实际上拼写错误)。具有误导性。
以上所有这些都不是火箭科学,但是在您有时间赛跑以准备好PR时,要提高血压会非常棘手。 #LearnInTheHardWay
故事的寓意?即使已经输入了目录名,也可以使用TAB自动补全功能。在上面的示例中,键入ls dir/MyV
Tab 将自动为您解决该错误情况,您将得到git mv dir
。在路径的每个部分继续使用 Tab 。