Как перенести все файлы текущего каталога в новый каталог и сохранить историю.
Я пробовал:
git mv . old_app
Но я получаю:
fatal: bad source, source=, destination=old_app/
Как перенести все файлы текущего каталога в новый каталог и сохранить историю.
Я пробовал:
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: mv * ./subDir
, которое будет выдавать предупреждение, но все же перемещать ваши файлы.
В то время как git mv
с использованием git mv * ./subDir
приведет к фатальной ошибке и прервет ход: fatal: can not move directory into itself, source=currentDir/subDir, destination=currentDir/subDir/subDir
Решение сделать работу git mv
прост: git mv -k * ./subDir
Параметр -k
просто пропустит все действия, которые приведут к ошибке.
Вам нужно включить расширенную глобализацию, чтобы вы могли использовать регулярные выражения.
Если вы используете shopt
оболочку bash
введите shopt
(shell option) перед выполнением команды, содержащей глоб:
$ 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
, включите расширенное глобирование следующим образом и используйте ^
чтобы отменить шаблон.
$ 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
соответственно.
Ответ вдохновлен https://superuser.com/a/112141.