Перемещение файлов GIT из папки в подпапку

Вопрос или проблема

У меня есть следующая структура папок.

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, сохраняя всю историю изменений файлов. Такой подход не только исправит текущие ошибки, но и обеспечит профессиональный уровень управления проектом, уважение к истории изменений и структурированным подходом к разработке программного обеспечения.

Пожалуйста, перед выполнением окончательных изменений всегда проверяйте тестовую среду, чтобы убедиться в правильности работы скрипта.

Оцените материал
Добавить комментарий

Капча загружается...