Подтвердить что ты не робот

Переместить все файлы текущего каталога в подкаталог и сохранить историю

Как перенести все файлы текущего каталога в новый каталог и сохранить историю.

Я пробовал:

git mv . old_app

Но я получаю:

fatal: bad source, source=, destination=old_app/
4b9b3361

Ответ 1

Я думаю, это недопустимая операция, которую вы делаете.

Вы не можете переместить текущий каталог (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

Поднимитесь на один уровень каталога и выберите каталоги, которые нужно переместить в целевой каталог. В этом случае также вы не можете заставить родительский каталог перемещаться внутри дочернего каталога. Содержимое/файлы родительского каталога можно сделать для перемещения в целевой каталог, но не сам родительский каталог.

Ответ 2

Я просто наткнулся на это сообщение об ошибке и, по-видимому, решение довольно просто.

Но прежде всего помните, что есть 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 просто пропустит все действия, которые приведут к ошибке.

Ответ 3

Вам нужно включить расширенную глобализацию, чтобы вы могли использовать регулярные выражения.

Если вы используете 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

Ответ 4

В 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.