在Git存储库中,如何正确重命名目录?


652

我认为应该将要重命名的目录复制到具有所需名称的新目录,然后删除旧目录,和git addgit commit以及push所有内容。但这是最好的方法吗?



5
就Git而言,复制和删除与移动相同。Git将以相同方式记录(复制+删除)和(移动)。
Dietrich Epp 2012年

Answers:


1178

基本重命名(或移动):

git mv <old name> <new name>

区分大小写的重命名-例如 从casesensitiveCaseSensitive—您必须使用两个步骤:

git mv casesensitive tmp
git mv tmp CaseSensitive

有关Git区分大小写的更多信息……

…接着是commit和push将是在git repo中重命名目录的最简单方法。


231
但是,如果您想从重新命名casesensitiveCaseSensitive,则可以这样操作: git mv casesensitive Temp然后 git mv Temp CaseSensitive
ViliusK 2014年

3
是否保存所有日志和统计信息?
orezvani 2014年

23
如果你正在处理区分大小写的目录没有简单的方法我已经找到@ViliusK是git rm -rf --cached path/to/your/directories重新添加和提交
dtothefp

1
但是,为什么GIT对包/目录的名称更改没有适当的支持?为什么我什至需要创建一个单独的文件夹。当我更改程序包名称时,是否应将其视为不同,并在提交和推送时妥善保管?
艾哈迈德

1
非常感谢。对我来说,我必须先执行git config core.ignorecase false然后连续运行命令,否则,第二部分我会得到一个source is empty错误。
丽卡

106

如果收到此错误:致命:重命名“文件夹名”失败:参数无效

尝试这个:

git mv foldername tempname && git mv tempname folderName


8
这正是我在目录中进行大小写更改所需要的。
cjserio

在此版本中,标记“ &&”不是有效的语句分隔符。git版本2.11.0.windows。
Tim Hardy

@Tim Hardy也可以作为两个单独的命令git mv foldername tempname和运行git mv tempname folderName,它们应在Windows上运行。
拉基思18'Oct

这行不通!最终结果将在'tempname'文件夹中放入新的'folderName'文件夹
打赌

61

1.将文件夹的名称从旧文件夹更改为新文件夹

git mv oldfolder newfolder

2.如果您的存储库中已经有newfolder,并且您想覆盖它并使用: -force

git mv -f oldfolder newfolder

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

3.在不区分大小写的文件系统上将foldername重命名为folderName

使用普通的mv命令(而不是git mv)进行简单的重命名不会被识别为来自git的文件更改。如果您使用'git mv'命令尝试,如以下行所示

git mv foldername folderName

如果您使用的是不区分大小写的文件系统(例如,在Mac上,并且未将其配置为区分大小写),则会遇到如下错误消息:

致命:重命名“文件夹名”失败:参数无效

为了使它正常工作,您可以执行以下操作:-

git mv foldername tempname && git mv tempname folderName

通过首先将文件夹重命名为一个完全不同的文件夹名称,这可以将重命名过程分开。将其重命名为不同的foldername之后,该文件夹最终可以重命名为新的folderName。在那些“ git mv”之后,请不要忘记添加并提交更改。尽管这可能不是一种漂亮的技术,但它可以很好地工作。该文件系统仍然无法识别字母大小写的变化,但是git可以将其重命名为新的文件夹名,这就是我们想要的:)


9

您可以使用文件系统重命名目录。然后,您可以执行git rm <old directory>git add <new directory>帮助页面)。然后,您可以提交并推送。

Git会检测到内容相同并且只是一个重命名操作,它将在历史记录中显示为重命名条目。您可以在使用之前检查是否是这种情况git status


12
嘿,但是这样,我将放弃整个提交历史。
ViliusK 2014年

1
如果使用-follow标志,则可以保留它。
Oleksi 2014年

两个命令而不是一个,并且必须添加一个标志?这在任何方面都比git mv好吗?
antgel 2014年

4
@topper不,git mv只是rm + add的别名。使用git mv是更好​​的解决方案。
Oleksi 2014年

5
@topper请注意,无论您使用哪种方法移动文件,仍然必须使用--follow查看历史记录。
Oleksi 2014年

3

我认为您不能从Web Application中进行操作,但是您可以重命名Git Client中的所有文件夹,它将把您的文件移动到新的重命名文件夹中,而不是提交并推送到远程存储库。

我有一个非常相似的问题: 我必须将不同的文件夹从大写重命名为小写(例如Abc-> abc),我已经使用虚拟名称(例如“ abc___”)重命名了所有文件夹,然后将其提交给远程存储库我将所有文件夹重命名为小写的原始名称(例如abc),然后把它们取了!


0

我分两步解决了。要使用mv命令重命名文件夹,您需要这样做的权限,如果没有权限,可以按照以下步骤操作。假设您要将区分大小写重命名为区分大小写。

步骤1:将文件夹(区分大小写)重命名为资源管理器中的其他名称。例如重命名区分大小写的folder1提交此更改。

步骤2:将此新命名的文件夹(folder1)重命名为预期的区分大小写的名称(区分大小写),例如。将folder1重命名为区分大小写。提交此更改。


0

对于区分大小写的重命名,git mv somefolder someFolder以前曾为我工作过,但今天由于某种原因没有。因此,作为一种解决方法,我创建了一个新文件夹temp,将中的所有内容somefolder移入temp,删除somefolder,提交temp,然后创建someFolder,将中的所有内容temp移入someFolder,删除temp,提交和推入someFolder并成功了!显示为someFoldergit。


-16

只需重命名文件夹。git是一个“内容跟踪器”,因此SHA1哈希值是相同的,并且git知道您已对其重命名。唯一更改的是树对象。

rm <directory>
git add .
git commit

1
这并不总是有效。它肯定对我不起作用。如20%的文件...
托马什Fejfar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.