LINUX.ORG.RU

Бэкап с помощью git — игнорирование субмодулей

 , ,


0

2

Хочу сделать удобный и переносимый бэкап с помощью git,
запилил .gitignore, добавил файлы и заметил, что другие репозитории, во вложенных папках добавились кау субмодули, то есть не будут включены в бэкап.

Как заставить гит игнорировать субмодули и добавлять файлы в них, несмотря ни на что?
Желательно также добавлять .git/*, чтобы сохранять все дерево.
Нужно решение, не требующее ручками делать --force на каждой такой папке

для своего гита укажи другой --git-dir='.git2'

BaBL ★★★★★ ()
Ответ на: комментарий от BaBL

git --git-dir='.git_backup' --work-tree=./ init
git --git-dir='.git_backup' --work-tree=./ add .
git --git-dir='.git_backup' --work-tree=./ status

--- cut ---
modified: c++/Reed-Solomon (modified content, untracked content)
--- cut ---

Не сработало, все равно вложенные репы игнорирует

mersinvald ★★★★ ()

Имх тебе надо написать скрипт, который проходит по дереву ПАПОК и каждую гитпапку пакует в tar, а при восстановлении наоборот.
Есть ещё другой вариант — проход по дереву папок и для каждой гитпапки генерить скрипт, который будет её клонить при восстановлении, причём именно той ревизии которая у тебя сейчас рабочая.
Может быть это всё можно сделать при помощи гитовых хуков.

Bad_ptr ★★★★ ()
Ответ на: комментарий от mersinvald
thomas@machine:~/Code/test$ git clone https://github.com/blabla/blabla.git

thomas@machine:~/Code/test$ git submodule add https://github.com/ujjwalkarn/Machine-Learning-Tutorials.git
Resolving deltas: 100% (330/330), done.
Checking connectivity... done.

thomas@machine:~/Code/test/blabla$ git submodule deinit -f Machine-Learning-Tutorials 
Cleared directory 'Machine-Learning-Tutorials'
Submodule 'Machine-Learning-Tutorials' (https://github.com/ujjwalkarn/Machine-Learning-Tutorials.git) unregistered for path 'Machine-Learning-Tutorials'

thomas@machine:~/Code/test/blabla$ cat .gitmodules
[submodule "Machine-Learning-Tutorials"]
	path = Machine-Learning-Tutorials
	url = https://github.com/ujjwalkarn/Machine-Learning-Tutorials.git

thomas@machine:~/Code/test/blabla$ git submodule init
Submodule 'Machine-Learning-Tutorials' (https://github.com/ujjwalkarn/Machine-Learning-Tutorials.git) registered for path 'Machine-Learning-Tutorials'

thomas@machine:~/Code/test/blabla$ git submodule update
Submodule path 'Machine-Learning-Tutorials': checked out '8c98b64bf748287da954f6f2233e88aeba8157ab'
Solace ★★ ()
Последнее исправление: Solace (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Второй вариант не подходит, но я вроде придумал как сделать. Если получится, напишу.

mersinvald ★★★★ ()
Ответ на: комментарий от Bad_ptr

Все, вопрос решен.
Сделал так:

#!/bin/bash
gitbackup="git --git-dir=.git_backup --work-tree=./"

# Find all submodules recursively
SUBMODULES=$(find ./ -type d -name .git | xargs -n 1 dirname | grep -v Go | grep -v usr)

# Works as git submodule foreach, but can be used for non-git-submodule git trees
for module in $SUBMODULES; do
        echo "Bundling $module"
        pushd $module > /dev/null 2>&1
        git bundle create ../.$(basename $module).bundle --all > /dev/null 2>&1
        popd > /dev/null 2>&1
        $gitbackup add $module/../.$(basename $module).bundle
done

# Trying to commit changes
$gitbackup commit -m "$(date)" > /dev/null 2>&1

# Checking if there were changes
if [ $? -eq 0 ]; then
       	# If so, bundling everything
        echo "Created commit \"$(date)\" with updates"
        echo "Bundling whole backup tree to ./.backup.bundle"
        $gitbackup bundle create .backup.bundle -1 master > /dev/null 2>&1
else
    	echo "Nothing changed, nothing to update"
fi

UPD: надо бы, конечно, еще привинтить туда git hook, определяющий по mime что добавлять, а что нет, а то windcard'ами в gitignore как-то костыльно

mersinvald ★★★★ ()
Последнее исправление: mersinvald (всего исправлений: 2)

Плохая идея, потому что место на диске когда-то закончится и git не умеет удалять старую историю.

anonymous ()
Ответ на: комментарий от anonymous

Ну так мне не фоточки бэкапить)
Всё дерево (тексты + несколько небольших бинарей (git bundles)) весит сейчас порядка 8мб.

Пока экспериментирую, не расширял дальше папки для говнокода, надо сначала нормальный gitignore написать или скриптик с find, но не думаю, что дерево вырастет больше 20мб.

mersinvald ★★★★ ()
Ответ на: комментарий от anonymous

Плохая идея, потому что место на диске когда-то закончится и git не умеет удалять старую историю.

А если сделать

git clone --depth 1 [REPO URL]

?

alx777 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.