Как экспортировать игнорируемые файлы, сохранив структуру папок в Git? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть проект, в котором я хочу отделить (не версионные / .gitignore d) файлы (большинство из них - файлы конфигурации) от фактического исходного кода. Я хочу скопировать их в структуру каталогов, идентичную структуре каталогов проекта. Например:

/foo
/bar/config/env.xml <-- ignored
/bar/config/env.xml.dist
/buz/keys <-- ignored
/buz/logs <-- ignored
/buz/source

$ git extract-ignored-files --exclude-from-extracting=/buz/logs (pseudocode)
Aimed result:

/bar/config/env.xml <-- ignored
/buz/keys <-- ignored

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

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

Ответы [ 3 ]

1 голос
/ 15 апреля 2020

rsync -R сохраняет относительные имена путей:

rsync -aR `git ls-files --others` ignored_files/
1 голос
/ 15 апреля 2020

Флаг --parents для cp будет поддерживать структуру каталогов.

mkdir ignored_files
  for x in `git status --ignored .`; do
  cp -va --parents $x ignored_files/$x
done
0 голосов
/ 18 апреля 2020

1. Определите пути, которые вы хотите перенести. Это будет подмножество набора игнорируемых файлов.

Это может быть сделано различными способами, например, путем просмотра .gitignore и преобразования его правил в пути или с помощью git status --ignored или git check-ignore *. Я предпочитаю так:

a. Получить все .gitignore d файлы (git ls-files --others > ./transfer-excludes.txt) (в моем случае я получил файл с 22k строками).

b. Определите из записей файла результатов вручную шаблоны, которые вы не (!) Хотите передать. Это могут быть, например, ваши настройки IDE, папка с внешними библиотеками, logs et c. - все, что вам точно не нужно будет копировать в другой экземпляр проекта.

2. Получить пути для передачи.

$ git ls-files --others --exclude-from=./transfer-excludes.txt > ./transfer-files.txt

Этот подход может потребовать дополнительных усилий. Но тогда все возможные пути игнорирования (включая исключенные подкаталогами .gitignore s) становятся видимыми и могут быть проверены.

3. Скопируйте файлы.

Это простой bash скрипт, который сканирует пути, создает необходимую структуру каталогов (используя mkdir -p) и копирует файлы:

#!/bin/bash
INFILE="./transfer-files.txt"
TARGETROOT="./transfer"
while read line
do
    TARGETDIR=`dirname $line`
    TARGETPATH="${TARGETROOT}/${TARGETDIR}"
    if [ ! -d "${TARGETPATH}" ]
    then
        mkdir -p "${TARGETPATH}"
    fi
    # echo ${TARGETPATH}
    cp "$line" "${TARGETPATH}"
done < ${INFILE}

В этом случае cp --parents вместо комбинации mkdir -p и cp не работает, поскольку не может рекурсивно создать полный путь, если его еще нет.

$ ./transfer.sh

Вот и все.


Небольшая проверка:

$ find ./transfer/ -type f -exec du -a {} +

Выходные данные должны совпадать со списком файлов из transfer-files.txt.

Возможные улучшения:

  • Шаги 2 и 3 можно объединить со скриптом. (Но иногда вы не захотите, чтобы иметь возможность сначала проверить список файлов.)
  • Еще одна идея улучшения: можно было бы создать Git ловушку, которая проверяет, ускоряет ли commit влияет на файл .gigitnore - в этом случае transfer-excludes.txt должен быть обновлен.
...