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
должен быть обновлен.