Альтернатива з використанням git-annex
:
Спочатку ми встановимо тестові файли:
#!/bin/bash
# faster than /dev/urandom
randfile='openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero'
dd='dd bs=1M count=5 iflag=fullblock'
for I in 1 2
do
mkdir root$I
cd root$I
for J in 1 2
do
mkdir dir$J
if [ -e dir2 ]
then
cd dir2
eval $randfile | eval $dd of=file1
eval $randfile | eval $dd of=file2
if [ `pwd | grep root1` ]; then
eval $randfile | eval $dd of=file3
elif [ `pwd | grep root2` ]; then
eval $randfile | eval $dd of=file4
fi
cd ..
fi
done
cd ..
done
При цьому створюються каталоги з бінарними файлами, що містять випадкові дані. У цей момент файли:
user@host$ find root? -path '*/.git*' -prune -o -print | sort -n
root1
root1/dir1
root1/dir2
root1/dir2/file1
root1/dir2/file2
root1/dir2/file3
root2
root2/dir1
root2/dir2
root2/dir2/file1
root2/dir2/file2
root2/dir2/file4
Тепер ми ініціалізуємо репост і виконуємо синхронізацію:
cd root1
git init
git annex init 'root1'
git remote add root2 ../root2
#git annex direct
git annex add .
git commit -a -m 'Files added.'
cd ..
cd root2
git init
git annex init 'root1'
git remote add root1 ../root1
#git annex direct
git annex add .
git commit -a -m 'Files added.'
cd ..
mkdir unioned
cd unioned
git init
git annex init 'unioned'
git remote add root1 ../root1
git remote add root2 ../root2
git annex add .
git commit -a -m 'Files added.'
git annex sync
cd ..
На даний момент вміст unioned/
:
user@host$ find root? unioned -path '*/.git*' -prune -o -print | sort -n
root1
root1/dir1
root1/dir2
root1/dir2/file1
root1/dir2/file2
root1/dir2/file3
root2
root2/dir1
root2/dir2
root2/dir2/file1
root2/dir2/file2
root2/dir2/file4
unioned
unioned/dir2
unioned/dir2/file1
unioned/dir2/file1.variant-065a
unioned/dir2/file1.variant-a33e
unioned/dir2/file2
unioned/dir2/file2.variant-08f3
unioned/dir2/file2.variant-75c4
unioned/dir2/file3
unioned/dir2/file4
Де *.variant-*
посилання повертається до різних файлів у різних сховищах. Крім того, unioned
досі не містить даних, поки ми не проведемо git annex get
. На даний момент git annex list
показує, де файли знаходяться та / або отримуються з:
user@host$ cd unioned; git annex list
here
|root1
||root2
|||web
||||
__X_ dir2/file1.variant-065a
_X__ dir2/file1.variant-a33e
__X_ dir2/file2.variant-08f3
_X__ dir2/file2.variant-75c4
_X__ dir2/file3
__X_ dir2/file4
Альтернатива в більш тривалій формі є git annex whereis
. Нарешті, для вирішення конфліктів та розповсюдження злиття зсередини unioned/dir2
:
cd unioned/dir2
git annex get # retrieve the actual content
git annex unlock # unlock the files - replace the symlinks with the actual repofiles
rm file1
git mv file1.variant-065a file1
git rm -f file1.variant-a33e
rm file2
git mv file2.variant-75c4 file2
git rm -f file2.variant-08f3
git annex add . # "commits" the changes, converts files back into symlinks
git annex sync # propagates the changes back to the other repos
Який урожай:
git annex sync
commit ok
pull root2
ok
pull root1
ok
push root2
Counting objects: 61, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (37/37), 2.67 KiB | 0 bytes/s, done.
Total 37 (delta 14), reused 0 (delta 0)
To ../root2
e5df80f..720b34b git-annex -> synced/git-annex
b055385..ad8c5c2 master -> synced/master
ok
push root1
Counting objects: 61, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (37/37), 2.67 KiB | 0 bytes/s, done.
Total 37 (delta 14), reused 0 (delta 0)
To ../root1
e5df80f..720b34b git-annex -> synced/git-annex
b055385..ad8c5c2 master -> synced/master
ok
Нарешті, git annex list
показується, де розташовані ці файли після синхронізації: у unioned/
каталозі є копії всіх файлів, вибраних з різних серверів, як зазначено вище.
git-annex
також є прямий режим, який працює безпосередньо у файловій системі без використання символьних посилань.
Налаштування цього для використання на віддалених комп'ютерах - це питання налаштування віддалених файлів через ssh за допомогою стандартного git, однак його поведінка описана тут: http://git-annex.branchable.com/walkthrough/using_ssh_remotes/
Загальна інформація про додаток до git розміщена тут: http://git-annex.branchable.com/walkthrough/
diff
?