如何将当前目录中的所有文件移动到一个新目录并保留历史记录。
我尝试过:
git mv . old_app
但是我得到:
fatal: bad source, source=, destination=old_app/
如何将当前目录中的所有文件移动到一个新目录并保留历史记录。
我尝试过:
git mv . old_app
但是我得到:
fatal: bad source, source=, destination=old_app/
git mv
生效的方法很简单:
git mv -k * ./subDir
-k
将会跳过所有可能导致错误的操作。这在较旧版本的 git 中可能不起作用。
记住有 mv
和 git move
两种移动方式。
正常的 bash 移动用法是:mv * ./subDir
,它只会产生一个警告,但仍然会移动您的文件。
而使用 git mv
来移动文件,例如使用 git mv * ./subDir
,将会产生致命错误并中止移动操作:
fatal: can not move directory into itself, source=currentDir/subDir, destination=currentDir/subDir/subDir
您需要启用扩展通配符,这样您才能使用正则表达式。
如果您正在使用bash
shell,请在执行包含通配符的命令之前输入此shopt
(shell选项)命令:
$ shopt -s extglob
如果您不想每次都输入此命令,您还可以将其添加到~/.bash_profile
文件中。
然后,您可以使用以下语法:
$ git mv ./!(exclude_me|exclude_me) ./destination_folder
root
├── aardvark
├── contrib
| ├── folder1
| └── folder2
├── custom
| ├── folder1
| └── folder2
├── elephant
├── hippopotamus
└── zebra
然后在 root
目录下运行以下命令:
$ 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
zsh
shell,可以通过以下方式启用扩展 globbing,并使用 ^
来否定模式。$ setopt extendedglob
$ git mv ^(exclude_me|exclude_me) ./destination_folder
$ git mv ^exclude_me ./destination_folder
client
的目录中,必须排除.git
和..
,命令如下:git mv ./!(client|.editorconfig|..|.|.git) ./client
。 - Val Redchenko我也遇到了同样的问题,解决方法是:
for file in $(ls | grep -v 'yourfolder'); do git mv $file yourfolder; done;
for file in $(ls); do git mv $file yourfolder; done;
我在Windows Git Bash上试过了。 - KeKruFOR %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
。参考https://superuser.com/a/112141。dir -exclude old_app | %{git mv $_.Name old_app}
。这个命令的灵感来自于https://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history/。 - Scott Stafford'{git'不是内部或外部命令
。 - A.P.%F
包含空格,你应该加上引号,另外,如果你在仓库的根目录中,也许还应该检查一下是否有.git
文件夹。 - Vladgit mv $(git ls-tree --name-only HEAD) <new-directory>
我会做你需要的事情。我相信这是最清晰的方式。
我想将所有的png文件移动到本地和远程仓库中的images子目录中:
mkdir images
git add *.png
git mv *.png ./images
git commit -m "move"
git push -u origin master
我认为,你正在进行无效操作。
你不能将当前目录(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
返回上一级目录,并选择要移动到目标目录的目录。在这种情况下,您不能将父目录移动到子目录中。可以将父目录的内容/文件移动到目标目录,但不能移动父目录本身。
git mv * someDir
被拒绝了。不过,我成功地一个一个地将每个文件夹和文件使用 git mv
命令移动到了另一个目录下,该目录也在项目根目录下 :-) - Lashae
-k
选项并跳过移动文件。这有什么用处? - LuxDiemkdir folder; giv mv -k * folder/
。这将导致现在所有的东西都在名为folder
的目录中。使用 git 的 2.8.3 版本。 - Captain Manmv -k (get-childItem *) folder/
命令代替。(参见SuperUser上的这个问题。) - Aaron Campbell