Вопрос или проблема
У меня есть следующая структура папок.
Service
|
-- App1
|
--- bin
|
--- file1
|
--- file2
|
--App2
|
--- bin
|
--- file1
|
--- file2
|
--- file3
|
--App3
|
--- bin
|
--- file1
|
--- file2
Я хочу переместить файлы только из корневой директории папок App в их соответствующие папки bin с сохранением истории GIT. Конечный результат должен выглядеть так:
Service
|
-- App1
|
--- bin
|
--- file1
|
--- file2
|
--App2
|
--- bin
|
--- file1
|
--- file2
|
--- file3
|
--App3
|
--- bin
|
--- file1
|
--- file2
Я попробовал следующее…
#!/bin/bash
dir1="/c/Service"
subs=`ls $dir1`
for i in $subs; do
git mv $dir1/$i/* $dir1/$i/bin/
done
…но вижу следующие ошибки:
fatal: can not move directory into itself
fatal: Invalid path ‘/c’: No such file or directory
Любая помощь будет признательна.
Из родительской директории Service
, вы можете сделать следующее:
$ for file in Service/*/*; do
if [[ -f "$file" ]]; then
echo mv "$file" "$(dirname -- "$file")/bin"
fi
done
mv Service/App1/file1 Service/App1/bin
mv Service/App1/file2 Service/App1/bin
mv Service/App2/file1 Service/App2/bin
mv Service/App2/file2 Service/App2/bin
mv Service/App2/file3 Service/App2/bin
mv Service/App3/file1 Service/App3/bin
mv Service/App3/file2 Service/App3/bin
Если это выглядит правильно, удалите echo
и выполните снова, чтобы на самом деле переместить файлы.
Обратите внимание, что вышеуказанный подход сохранит историю git, как и запрашивалось. Если вы не хотите сохранять её, а вместо этого хотите добавить эти команды в историю git, просто используйте git mv
вместо mv
:
for file in Service/*/*; do
if [[ -f "$file" ]]; then
echo git mv "$file" "$(dirname -- "$file")/bin"
fi
done
Ответ или решение
Если вы являетесь ИТ-специалистом, и перед вами стоит задача перемещения файлов из корневых каталогов приложений в соответствующие папки bin
при использовании GIT и при этом хотите сохранить историю изменений, вам необходимо быть предельно аккуратным в подходе к этой задаче. Рассмотрим детально, как можно решить эту проблему.
Шаги по перемещению файлов с сохранением истории в GIT
1. Анализ структуры директорий
В вашей структуре директорий файлы, расположенные в корневом каталоге каждого приложения (App1
, App2
, App3
), требуется переместить в их соответствующие подкаталоги bin
. Например, Service/App1/file1
должен быть перемещен в Service/App1/bin/file1
.
2. Ошибки в текущем подходе
Вы упомянули две проблемы:
- Ошибка "cannot move directory into itself" указывает на попытку выполнить недопустимую операцию перемещения.
- Ошибка "Invalid path ‘/c’: No such file or directory" свидетельствует о неправильной интерпретации пути в Windows.
3. Корректировка скрипта
В первоначальном примере скрипт на Bash, скорее всего, не учитывал, что git mv
перемещает файлы, а не директории. Вам нужно изменить подход, используя условие проверки файла и корректную интерпретацию путей.
4. Корректный процесс перемещения
Можно использовать следующий упрощённый и более надежный подход для Linux/Unix систем. Перед тем как выполнить команды, вы можете проверить, что будет сделано, добавив команду echo
, как показано ниже. Это поможет избежать случайных ошибок.
cd /path/to/Service
for app_dir in Service/*; do
if [[ -d "$app_dir/bin" ]]; then
for file in "$app_dir"/*; do
if [[ -f "$file" ]]; then
echo git mv "$file" "$app_dir/bin/"
fi
done
fi
done
5. Выполнение команд
После проверки команд, удалите echo
, чтобы команды действительно выполняли перемещение:
cd /path/to/Service
for app_dir in Service/*; do
if [[ -d "$app_dir/bin" ]]; then
for file in "$app_dir"/*; do
if [[ -f "$file" ]]; then
git mv "$file" "$app_dir/bin/"
fi
done
fi
done
Заключение
Убедитесь, что пути настроены корректно для вашей системы, и используйте git mv
, чтобы сохранить историю изменений. Это гарантирует, что все ваши изменения будут отслеживаться GIT, сохраняя всю историю изменений файлов. Такой подход не только исправит текущие ошибки, но и обеспечит профессиональный уровень управления проектом, уважение к истории изменений и структурированным подходом к разработке программного обеспечения.
Пожалуйста, перед выполнением окончательных изменений всегда проверяйте тестовую среду, чтобы убедиться в правильности работы скрипта.