在 Git 仓库中,如何正确地重命名一个目录?

1005

我认为将要重命名的目录复制到一个新目录,然后删除旧目录,并使用git addgit commitpush命令来操作应该可以实现。但这是最好的方式吗?


1
可能是重复问题:如何告诉Git这是同一个目录,只是名称不同 - Christopher Peisert
6
就Git而言,复制和删除与移动是相同的事情。Git会以相同的方式记录复制、删除和移动操作。 - Dietrich Epp
13个回答

1913

基本重命名(或移动):

git mv <old name> <new name>

大小写敏感的重命名,例如从casesensitive改为CaseSensitive,需要进行两步操作:

git mv casesensitive tmp
git mv tmp CaseSensitive

(更多关于Git中大小写敏感性的信息…)

紧接着提交并推送是在Git存储库中重命名目录的最简单方法。


277
如果你想把casesensitive重命名为CaseSensitive,可以这样做:`git mv casesensitive Temp` 然后 `git mv Temp CaseSensitive` - ViliusK
7
它是否保存所有日志和统计信息? - orezvani
46
如果你正在处理区分大小写的目录,我发现一个简单的方法是使用git rm -rf --cached path/to/your/directories,然后重新添加并提交。 - dtothefp
6
为什么GIT没有对包/目录名称更改提供适当的支持?为什么我需要创建一个单独的文件夹?当我更改包的名称时,它不应该将其视为差异,并在提交和推送时加以处理吗? - Ahmed
5
非常感谢。对于我来说,我必须首先执行 git config core.ignorecase false,然后按顺序运行命令,否则在第二部分中我会收到“源为空”的错误提示。 - Hossein
显示剩余12条评论

189
如果您收到此错误:fatal: renaming ‘foldername’ failed: Invalid argument
请尝试以下方法:
*nixOS: git mv foldername tempname && git mv tempname folderName WinOS: git config core.ignorecase false; git mv foldername tempname; git mv tempname folderName

14
这正是我需要在目录中进行大小写转换的方法。 - cjserio
在此版本中,“&&”标记不是有效的语句分隔符。Git版本为2.11.0.windows。 - Tim Hardy
@Tim Hardy 它也可以作为两个单独的命令运行,git mv foldername tempnamegit mv tempname folderName,这应该在Windows上可以工作。 - Larkeith
1
这个不起作用!最终结果将在“tempname”文件夹内放置一个新的“folderName”文件夹。 - bet

91

1. 将文件夹的名称从oldfolder更改为newfolder

git mv oldfolder newfolder

2. 如果newfolder已经存在于你的代码库中,且你想要覆盖它并使用:- force

git mv -f oldfolder newfolder

重命名文件夹时,如果目标系统是大小写不敏感的系统,使用普通的mv命令(而不是git mv)进行简单重命名不会被Git识别为文件更改。在重命名时,请使用‘git mv’命令,按如下方式执行操作:

不要忘记在重命名后将更改添加到索引中并提交。

git mv foldername folderName

如果你正在使用不区分大小写的文件系统(例如,你使用的是Mac电脑并且没有将它配置为区分大小写),那么你会遇到以下类似的错误信息:

fatal: 重命名 'foldername' 失败:无效参数

为了解决这个问题,你可以执行以下操作:

git mv foldername tempname && git mv tempname folderName

这种方法将重命名过程分为两步,首先将文件夹重命名为完全不同的文件夹名称。在将其重命名为不同的文件夹名称之后,最终可以将该文件夹重命名为新的文件夹名称。在那些“git mv”之后,不要忘记添加和提交更改。虽然这可能不是一种很好看的技术,但它完美地运行。虽然文件系统仍然无法识别字母大小写的更改,但由于将其重命名为新的文件夹名称,git会识别到,这就是我们想要的 :)


24

有许多正确的答案,但当我来到这里复制并粘贴一个带历史记录的文件夹重命名时,我发现了这个。

git mv <old name> <new name>

旧文件夹(它本身)移动到 新文件夹 中嵌套。

同时

git mv <old name>/ <new name>

注意'/'会将嵌套的内容旧文件夹移动到新文件夹

两个命令都没有复制嵌套文件的历史记录。我最终逐个重命名了每个嵌套文件夹✔

git mv <old name>/<nest-folder> <new name>/<nest-folder>

15
您可以使用文件系统来重命名目录。 然后,您可以执行git rm <old directory>git add <new directory>帮助页面)。 然后,您可以提交并推送更改。Git将检测到内容相同且只是一个重命名操作,并将其显示为历史记录中的重命名条目。在提交之前,您可以使用git status命令检查是否是这种情况。

28
嘿,但这样做,我将失去整个提交历史记录。 - ViliusK
3
如果使用“-follow”标志,您可以保留它。 - Oleksi
2
两个命令代替一个,还需要添加标志?这比git mv更好吗? - antgel
7
不,git mv 只是 rm+add 的别名。使用 git mv 是更好的解决方案。 - Oleksi
7
请注意,无论您使用哪种方法移动文件,仍需要使用“--follow”选项以查看历史记录。 - Oleksi
显示剩余3条评论

5

以下是重命名目录的示例。

git mv src/dir1/ src/dir2/

如果您遇到“权限被拒绝”的错误,请尝试:
git mv src/dir1 src/temp/
git mv src/temp src/dir2

4

我认为从 Web 应用程序中你不能这样做,但是你可以在 Git 客户端中重命名所有文件夹,它会将你的文件移动到新的重命名的文件夹中,然后提交并推送到远程仓库。

我曾经遇到过一个非常相似的问题: 我需要将不同的文件夹从大写字母改成小写字母(例如Abc -> abc),我使用一个虚拟名称(例如“abc___”)重命名了所有文件夹,然后提交到远程仓库,之后我将所有文件夹重新命名为原始的小写字母名称(例如abc),它们就被接受了!


2

对于区分大小写的重命名,以前我使用git mv somefolder someFolder 成功过,但今天由于某些原因无法使用。因此,我创建了一个新文件夹temp,将somefolder的所有内容移动到temp中,删除somefolder,提交temp,然后创建someFolder,将temp中的所有内容移动到someFolder中,删除temp,提交并推送someFolder,这样就可以成功了!在git中显示为someFolder


我认为我们并不需要一个临时文件夹,需要执行以下步骤:
  1. 将somefolder重命名为任何其他名称(例如somefolder1)
  2. 提交并推送更改
  3. 将somefolder1重命名为someFolder
  4. 提交并推送更改。
- tezyakov

2
我尝试使用以下命令,但它并没有起作用。我收到了一个“fatal:重命名'...'失败:无效参数”的错误。
git mv oldName NewName

然后使用以下方法解决:

  1. 首先,我复制了想要重命名的文件夹。
  2. 然后,我运行了以下命令来删除该文件夹。
git rm oldName -r
  1. 将重复的文件夹重命名为NewName

2

简单技巧

您只需要将目录重命名为任何临时名称,然后再次重命名即可使其正常工作。


1
这是一个很棒的技巧!节省了很多时间,谢谢。 - Matthew Becker
1
这是一个很棒的技巧!节省了很多时间,谢谢你。 - Matthew Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接