Git 将当前目录的所有文件移动到子目录中并维护历史记录
如何将当前目录中的所有文件移动到新目录并保留历史记录 我试过:Git 将当前目录的所有文件移动到子目录中并维护历史记录,git,Git,如何将当前目录中的所有文件移动到新目录并保留历史记录 我试过: git mv . old_app 但我得到: fatal: bad source, source=, destination=old_app/ 我想,你做的这个手术是无效的 无法将当前目录(pwd)移动到当前目录内的其他目录。即使是mv命令也不起作用。正如输出所说 mv: cannot move ‘.’ to ‘someDir/.’: Device or resource busy 在git mv中使用* git mv * s
git mv . old_app
但我得到:
fatal: bad source, source=, destination=old_app/
我想,你做的这个手术是无效的 无法将当前目录(pwd)
移动到当前目录内的其他目录。即使是mv
命令也不起作用。正如输出所说
mv: cannot move ‘.’ to ‘someDir/.’: Device or resource busy
在git mv中使用*
git mv * someDir
fatal: can not move directory into itself, source=curDir, destination=curDir/someDir
上一级目录,选择要移动到目标目录的目录。在这种情况下,也不能使父目录移动到子目录中。可以使父目录内容/文件移动到目标目录,但不能移动到父目录本身。我刚刚偶然发现了此错误消息,显然解决方案非常简单 但首先要记住的是
mv
和git-move
bash move的正常用法是:
mv*/subDir
,它只会产生警告,但仍会移动文件
而使用git mv*/subDir
的git mv
将产生致命错误并中止移动:fatal:无法将目录移动到自身中,source=currentDir/subDir,destination=currentDir/subDir/subDir
使git mv工作的解决方案很简单:git mv-k*/subDir
只需跳过所有会产生错误的操作。您需要启用,才能使用正则表达式
如果在执行以glob为特征的命令之前使用shell,请键入此(shell选项)命令:
$ shopt -s extglob
(如果不想每次都键入此内容,也可以将其添加到~/.bash\u配置文件中)
然后可以使用以下语法:
$ git mv ./!(exclude_me|exclude_me) ./destination_folder
例如,如果这是您的文件夹结构:
root
├── aardvark
├── contrib
| ├── folder1
| └── folder2
├── custom
| ├── folder1
| └── folder2
├── elephant
├── hippopotamus
└── zebra
然后在根目录下运行以下命令:
$ shopt -s extglob
$ git mv ./!(custom|contrib) ./contrib
您将得到以下结果:
root
├── contrib
| ├── aardvark
| ├── elephant
| ├── folder1
| ├── folder2
| ├── hippopotamus
| └── zebra
└── custom
├── folder1
└── folder2
如果要执行测试运行,请添加-n
标志,并确保命令执行时不会出现错误:
$ git mv -n ./!(exclude_me|exclude_me) ./destination_folder
添加-k
标志以包括不受版本控制的文件:
$ git mv -k ./!(exclude_me|exclude_me) ./destination_folder
如果使用shell,请按以下方式启用扩展全局绑定,并使用^
取消模式
$ setopt extendedglob
$ git mv ^(exclude_me|exclude_me) ./destination_folder
$ git mv ^exclude_me ./destination_folder
在Windows上,您可以使用:
FOR %F IN (*) DO IF NOT %F == old_app git mv %F old_app
FOR /D %D IN (*) DO IF NOT %D == old_app git mv %D old_app
如果在批处理文件中执行此操作,则需要分别使用%%F
和%%D
,而不是%F
和%D
灵感来源于。我想将所有png文件移动到本地和远程repo中的images子目录:
mkdir images
git add *.png
git mv *.png ./images
git commit -m "move"
git push -u origin master
如果您是windows用户,这是一个适合您的解决方案
如果尚未安装Turtoise Git,请安装它
选择要移动的文件夹
鼠标右键,Turtoise git,重命名
所以,我也遇到了同样的问题,这份工作对我来说是什么
for file in $(ls | grep -v 'yourfolder'); do git mv $file yourfolder; done;
因此,应用-k
并跳过移动文件。这有什么用呢?因为mv命令总是失败,因为它试图将目录移动到自身中。因此,该操作将成为一个无止境的循环,因此会产生错误,并且不会移动任何内容。但是使用-k选项,它不会失败,也不会以一个无休止的循环结束。是的,但它实际上不会起任何作用,我已经尝试过了。@LuxDie很抱歉反应太晚。我刚刚再次测试了这个解决方案,我可以断定它是有效的。您需要确保您的文件位于Git存储库中并已提交。你确定你得到了上面的无法移动。。。在没有-k
的情况下,将错误消息转换为自身
?这对我很有用。它不仅仅是抑制错误消息,它还抑制可能是错误的操作<代码>mkdir文件夹;giv mv-k*文件夹/
。这将导致所有内容现在都位于名为文件夹的目录中。使用2.8.3版git。有关如何使用扩展全局搜索而不抑制错误,请参阅我的答案。是的,您执行命令的方式被拒绝。但是,我设法将每个文件夹和文件一个接一个地git mv
放到项目根目录下的另一个目录:-)这个答案帮助我将一个角度项目移动到一个名为client
的目录,必须排除.git
和。
还有:git mv./!(client |.editorconfig |.|.|.|.git)。/client
在Windows Powershell上,您可以使用以下命令:dir–exclude old_app |%{git mv$|.Name old_app}
,灵感来自@ScottStafford如何在从Powershell调用的批处理文件中使用您的命令?我发现以下错误,“{git”未被识别为内部或外部命令
您可能应该在%F
周围添加引号,以防它包含空格,或者检查“.git”如果您在存储库的根目录中,也可以使用文件夹。这不是答案吗?很好!但我认为您可以省略grep,不是吗?对于$(ls)中的文件;do git mv$file yourfolder;done;
我在Windows git Bash上试用过