git mv,只改变目录的大小写
虽然我发现类似的问题,我没有find我的问题的答案
当我尝试重新命名目录从FOO到foo通过git mv FOO foo
我得到
fatal: renaming 'FOO' failed: Invalid argument
好。 所以我试试git mv FOO foo2 && git mv foo2 foo
但是当我尝试通过git commit .
我明白了
# On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # foo nothing added to commit but untracked files present (use "git add" to track)
当我通过git add foo
目录git add foo
没有改变和git commit .
再次给我同样的信息。
我究竟做错了什么? 我以为我使用的是一个区分大小写的系统(OSX)为什么我不能简单地重命名目录?
您处于不区分大小写的环境。 此外,添加-A
不会照顾mv
的删除端,因为Git了解它。 警告! 确保在执行此操作时不会出现其他更改或未跟踪的文件,否则将作为此更改的一部分提交。 首先,做到这一点,然后git stash pop
后。 继续:要解决这个问题,请执行以下操作:
mv foo foo2 git add -A git commit -m "renaming" mv foo2 FOO git add -A git commit --amend -m "renamed foo to FOO"
这是改变工作目录,提交,然后崩溃2提交的方式。 你可以将索引中的文件移动到git中,但对于正在发生的事情可能不够明确。 较短的版本是
git mv foo foo2 git mv foo2 FOO git commit -m "changed case of dir"
正如其中一条评论所build议的那样,你也可以做一个交互式的rebase( git rebase -i HEAD~5
如果错误的情况是在5次提交之前引入的)来修复这个案例,并且没有错误的情况出现在历史的任何地方所有。 如果你这样做的话,你必须小心,因为从此以后的提交将会有所不同,其他人将不得不重新分配或重新合并他们的工作与最近的分支。
这与更正文件的名称有关: git是否不区分大小写?
你想将选项core.ignorecase
设置为false,这将使Git注意不支持本机的文件系统。 要在您的回购中启用:
$ git config core.ignorecase false
然后你可以用git mv
重命名这个文件,它可以像预期的那样工作。
我能解决这个问题,使用git 1.7.7通过使用临时文件名:
$ git mv improper_Case improve_case2 $ git mv improve_case2 improve_case $ git commit -m "<your message>"
强制使用-f选项:
git mv -f FOO foo
( git mv
-free变体)
我在Mac OS X 10.9的Git中遇到了这个问题。 我解决它如下:
git rm -r --cached /path/to/directory
这在Git中删除目录的阶段,但实际上并没有删除任何物理文件( – --cached
)。 这也使目录,现在与正确的情况下,显示在未跟踪的文件。
所以你可以这样做:
mv /path/to/directory /path/to/DIRECTORY git add -A /path/to/DIRECTORY
然后Git会认识到你已经重命名了这些文件,当你做git status
你应该会看到一些renamed:
行。 检查他们,并确保他们看起来是正确的,如果是这样,你可以正常提交更改。
这是一个快速和错误安全的解决scheme:
git mv -f path/to/foo/* path/to/FOO/
警告! 始终重命名重命名文件夹中的所有文件(使用/*
)。
不要重命名单个文件。 这导致了一个错误,在这个答案中描述。
如果你首先想看到结果,使用-n
:
git mv -f -n path/to/foo/* path/to/FOO/
你做了一个mv
:
- 提交更改
- 签出任何其他修订
- 结账回来。
现在Git应该在其内部文件和文件系统中重命名文件夹BOTH。
除非您明确select,否则您不会在OS X中使用区分大小写的文件系统。 HFS + 可以区分大小写,但默认情况下不区分大小写。
这个页面上的所有gitfoo都是一个非常简单的解决scheme。
- 手动将文件复制到项目外。
- git rm所有的文件。
- git commit就像正常一样。
- 手动添加文件。
- git添加所有的文件。
- git commit就像正常一样。
- 利润。
提高Adam Dymitruk的答案(愚蠢,所以不让我评论他的答案),使用“git mv”将自动准确地移动文件。 不需要存储,可以避免冒险的“git add -A”:
old="abc"; new="ABC"; tmp="$old-renamed"; git mv "$old" "$tmp"; git commit -m "Renamed '$old' to '$tmp'."; git mv "$tmp" "$new"; git commit --amend -m "Renamed '$old' to '$new'.";
我有一个相关的问题。
一个名为“Pro”(首先创build)和另一个“pro”(由错误创build)的文件夹。 在Mac中,它是一样的东西,但根据git不同。
$ git config core.ignorecase false
git config将文件重命名为正确的文件夹(谢谢),并且还在'pro'(No !!)中创build了ghost文件。 我无法将鬼文件更改添加到轨道上,除非随身携带这些文件,否则我无法检出其他分支,也无法以某种方式重置它。
相反,我做到了
$ git rm -r --cached pro $ git status // => pro files removed, new Pro files untracked $ git add Pro
为了使它更加安全,我在一个特性分支中完成了,然后我合并回了主分支
对于创build的ghost文件问题,可以任何guru解释如何和为什么? 提前致谢。