Переместить файлы репозитория git в подпапки в соответствии с расширением - PullRequest
1 голос
/ 24 апреля 2019

Что я хочу сделать .

Все файлы в моем репо находятся в одной папке, но эта папка содержит другие файлы, исключенные .gitignore.Я хочу реорганизовать (программно) эти файлы только из репозитория (а не игнорируемых) в разные папки в соответствии с их расширениями.

Пример. .

Допустим, у меня есть папка /project с:
a.py, b.py, c.py, 1.png, 2.png, 3.png
, где
- a.py, b.py, 1.png, 2.png в репозитории git;
- c.py, 3.png не в репозитории git, т.е. они игнорируютсясогласно правилам в .gitignore.

В конце я хочу иметь две подпапки:
- /project/scripts, содержащие a.py и b.py;
- /project/images, содержащие 1.png и 2.png;
, в то время как
- /project все еще содержит c.py и 3.png.

Некоторые идеи .

Я прочитал документацию по команде git mv, но не увидел, что могу фильтровать файлы напрямую из команды git mv.

Одна из идей - перечислить эти файлы изсделайте репо, используя git ls-files, затем перенаправьте его на git mv.Но я подозреваю, что это так же плохо, как трубопровод ls и mv.

В крайнем случае, я мог бы использовать цикл for, но я уверен, что кто-то там знает лучше.На самом деле, я не уверен, что это обойдёт проблему передачи ls с mv.

форматом имен файлов .

Имена файлов не очень экзотичны: кроме их расширений (.py, .png) они содержат только буквенно-цифровые символы [a-zA-Z0-9], дефисы - и подчеркивания _.Так что пикирование git ls-files с git mv, возможно, не конец света.

1 Ответ

2 голосов
/ 24 апреля 2019

Предполагая, что теперь ваши файлы находятся в каталоге project, и вы хотите переместить только отслеженные файлы в разные каталоги, вы можете использовать

mkdir scripts images
find project/ -name "*.py" -exec git mv -k {} scripts/ \;
find project/ -name "*.png" -exec git mv -k {} images/ \;
git commit

Вы найдете все файлы, соответствующие определенному шаблону.Затем вы переместите эти файлы, но только если они отслеживаются git, в указанную папку.В противном случае команда git mv пропустит эти файлы (например, потому что они игнорируются .gitignore).

со страницы руководства git mv:

   -k
       Skip move or rename actions which would lead to an error condition.
       An error happens when a source is neither existing nor controlled by Git, or
       when it would overwrite an existing file unless -f is given.

На самом делеВы можете опустить параметр -k, так как команда git mv выполняется для каждого найденного файла.Было бы просто напечатать сообщение об ошибке и продолжить с оставшимися файлами.С другой стороны, это необходимо при выполнении git mv для более чем одного файла одновременно (например, git mv project/* new_folder/), потому что в этом случае он просто завершится ошибкой и пропустит оставшиеся файлы.

...