Как я могу создать резервную копию рабочей области StGit? - PullRequest
2 голосов
/ 15 декабря 2011

Я часто использую git 'guerrilla-style', вкладывая git-репо в песочницу Subversion, Perforce или CVS.Когда я работаю таким образом, мне нравится создавать «удаленное» репо на USB-накопителе, чтобы у меня была резервная копия на случай, если мой жесткий диск умрет:

$ git --bare init /f/projects/myproj.git
$ git remote add origin /f/projects/myproj.git
$ git push -u origin master

Тогда мне просто нужно запомнитьвремя от времени набираю git push, чтобы сделать резервную копию моей работы.Если мой репо будет закрыт, я могу получить его обратно:

$ git clone /f/projects/myproj.git

В последнее время я поддерживаю стек патчей для репозитория Perforce вышестоящего уровня, используя StGit.Моя простая стратегия резервного копирования больше не работает в этом случае.Похоже, что ни git clone, ни stg clone не работают: если я наберу stg series после клонирования, это скажет мне stg series: master: branch not initialized.

Возникнув, я видел, что stgit создает ветку master.gitи несколько других временных (??) веток для хранения метаданных.Похоже, что можно настроить все так, чтобы все эти ветви были перенесены в резервное хранилище, но я не уверен, как это сделать.

Обновление [12/ 15/2011]: Глядя на репозиторий, управляемый stgit, для которого я хочу создать резервную копию в qgit, я вижу, что это выглядит так:

enter image description here

Я попробовал предложение Джефроми об использованииpush --all:

$ git --bare init luasand_stg_bak
Initialized empty Git repository in c:/d/projects/luasand_stg_bak/
$ cd luasand_stg
$ git remote add backup ../luasand_stg_bak
$ git push -u --all backup
Counting objects: 369, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (364/364), done.
Writing objects: 100% (369/369), 467.79 KiB, done.
Total 369 (delta 73), reused 0 (delta 0)
To ../luasand_stg_bak
 * [new branch]      master -> master
 * [new branch]      master.stgit -> master.stgit
Branch master set up to track remote branch master from backup.
Branch master.stgit set up to track remote branch master.stgit from backup.

Это выдвигает ветку master.stgit, но не выдвигает некоторые другие необходимые метаданные:

enter image description here

Из вышеприведенногоНа снимке экрана вы видите папку верхнего уровня patches и папку refs/patches, которые присутствуют в исходном репо, но отсутствуют в резервной копии.Все это заставляет меня поверить, что я лаю не на том дереве.Есть ли нет способа резервного копирования метаданных StGit с помощью стандартных команд git?Если нет, то как лучше всего выполнить резервное копирование моей незавершенной серии сложных исправлений на случай повторной перезагрузки или сбоя жесткого диска?

Ответы [ 2 ]

5 голосов
/ 16 декабря 2011

Кажется, что попытка создать резервную копию рабочей области StGit путем клонирования контрпродуктивна. Я остановился на более простом методе, основанном на stg export и stg import. Это работает так:

$ pwd
/c/d/projects/luasand_stg
$ stg push -a
$ stg series
+ add-copyright-notice
+ add-bn-namespace
> fix-tabs
$ stg export --dir=/f/projects/luasand_stg_patches
Checking for changes in the working directory ... done
$ cd ..
# Pretend STG sandbox got borked
$ rm -rf luasand_stg
# Re-clone it from the original repo
$ stg clone luasand luasand_stg
Cloning into luasand_stg...
done.
$ cd luasand_stg
# No patches?  No problem, just reimport them from the backup
$ stg series
$ stg import -s /f/projects/luasand_stg_patches/series
Checking for changes in the working directory ... done
Importing patch "add-copyright-notice" ... done
Importing patch "add-bn-namespace" ... done
Importing patch "fix-tabs" ... done
Now at patch "fix-tabs"
# Everything restored
$ stg series
+ add-copyright-notice
+ add-bn-namespace
> fix-tabs

Итак, вместо того, чтобы пытаться выполнить резервное копирование всего репо, я просто копирую каждый отдельный патч до /f/projects/luasand_stg_patches на моей флешке. Это означает, что я должен убедиться, что исходное хранилище luasand также где-то скопировано, поэтому я могу воссоздать состояние моей рабочей области, (клонировав) ее с stg clone и повторно импортировав свои патчи. 1009 *

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

2 голосов
/ 15 декабря 2011

Если они действительно являются всеми ветвями (и я верю, что они есть), вы можете использовать git push --all для проталкивания всех ветвей.

Если есть другие ссылки (например, ссылки / патчи), есть также git push --mirror, что сделает удаленный репозиторий точно таким же, как ваш (т.е. это подходит только для точного зеркала, поэтому будьте осторожны).

Однако каталог дополнительных исправлений на верхнем уровне невсе, что Git знает, так что ничто никогда не подтолкнет это.Если его содержимое важно для StGit, то ваш лучший вариант, вероятно, прибегнуть к rsync.Он достаточно умен, чтобы не переписывать вещи, поэтому он не должен быть таким медленным.

Я должен также отметить, что StGit не делает ничего, что вы не можете сделать с Git.Это просто скрывает некоторые вещи от вас.Вы можете сделать почти все это с помощью комбинации временных веток, копить и перебазировать.И если вы сделаете это, Git будет знать обо всем, и push --mirror будет отлично работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...