Возможно ли через git копирование на внешний жесткий диск

Vasek

Хочу организовать домашние хранение исходников. И интересует следующий вопрос:

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

Например если я проталкиваю изменения, то на жестком в определеной папке создается папка (а еще лучше сжатый архив) с именем проекта и датой внесения и в это папку (или архив) заносится полная копия текущей версии проекта.

PS: В git я новичок, поэтому вопрос может быть банальным, но меня интересует возможно ли это в принципе сделать именно средствами git.

Если это возможно сделать, то буду признателен если напишете приблизительно описание как это можно реализовать.

Операционка - windows.

2 ответа

Vasek

Лучший способ делать бэкап репозитория Git — это репозиторий Git (как ни странно).

Копировать в архивы и папки — плохо и неэффективно. Во-первых, вы таким образом ломаете всю идею и делаете очень неудобные в использовании бэкапы. Во-вторых, Git очень эффективно хранит свои данные и простой архив вам такой эффективности не предоставит.

Предлагаю такой способ: сделать локальный bare репозиторий и обновлять в него.

Делаем резервную копию

Пример: репозиторий у нас лежит в ~/repo. Резервную копию мы будем создавать в ~/backup.

$ mkdir ~/backup
$ cd ~/backup
$ git clone --mirror --no-hardlinks ~/repo

После этого в папке ~/backup/repo.git будет создан bare-репозиторий. Обратите внимание, что папка не просто .git, а repo.git. Параметр --mirror делает следующее.

  • Включает в себя параметр --bare — cделать репозиторий голым (bare). Такой репозиторий хранит только файлы Git и не хранит обычные файлы в рабочей области (в резервной копии они нам не нужны)
  • Заставляет Git копировать все ветки (branches), метки (tags) и другое. Подробнее в документации.

Параметр --no-hardlinks нужен для того, чтобы Git не пытался сэкономить место, делая хардлинки вместо прямого копирования файлов. Для резервной копии хардлинки не годятся.

Обновляем резервную копию

Теперь мы можем подключить эту резервную копию как remote и в нее делать push.

$ cd ~/repo
$ git remote add backup ~/backup/repo.git
$ git push backup --all

Либо заходить в папку резервной копии и там делать update

$ cd ~/repo
$ git --git-dir=~/backup/repo.git remote update

Параметром --git-dir мы явно указываем Git, где искать его директорию. Сам не найдет, т.к. имя нестандартное.

Восстанавливаемся из резервной копии

Разумеется, для этого понадобится Git. Если совсем нет возможности его установить, попробуйте Git Portable от sheabunge.

Вместе с репозиторием

обычным копированием взять любую сохраненную версию.

Чтобы достать сохраненную версию из нашего резервного репозитория:

cd ~/new-repo
git clone ~/backup/repo.git .
git pull --all

Теперь у нас есть полная копия того репозитория + версия рабочей области из последнего коммита в master. Можем получить любое другое сохраненное состояние:

git checkout

Только файлы из резервной копии

git --git-dir=~/backup/repo.git --work-tree=куда/положить/файлы checkout

Параметр --work-tree указывает Git путь, который он будет считать своей рабочей областью на время выполнения текущей команды. Путь должен существовать (т.е. Git не будет создавать его сам).

Только файлы из рабочего репозитория

cd ~/repo
git --work-tree=куда/положить/файлы checkout

Git просто скопирует текущее состояние рабочей области туда, куда нужно.


Vasek

Вам потребуется использовать хуки (hooks) и ознакомиться с особенностями использования хуков в windows, вопросы по теме., возможно поможет эта статья.

licensed under cc by-sa 3.0 with attribution.