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上试用过