У меня есть необычная идея использовать git в качестве системы резервного копирования. Допустим, у меня есть каталог ./backup/myfiles, и я хочу сделать резервную копию, используя git. Для сохранения чистоты я не хочу, чтобы в папке myfiles был каталог .git, поэтому я подумал, что могу создать ./backup/git_repos/myfiles. Посмотрев на git docs, я попытался сделать это:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Вы можете увидеть сообщение об ошибке, которое я получил там. Что я делаю не так?
Ответы:
Это будет делать то, что вы хотите, но, очевидно, будет отстой, когда вам нужно будет указать это с каждой командой Git, которую вы когда-либо использовали
Вы можете экспортировать,
GIT_WORK_TREE=.
иGIT_DIR=../backup
Git подберет их для каждой команды. Это только позволит вам удобно работать в одном репозитории на оболочку.Я бы предпочел использовать символическую ссылку на каталог .git в другом месте или создать символическую ссылку на каталог .git из основного каталога резервного копирования.
источник
Вам просто нужно убедиться, что хранилище знает, где находится дерево работы, и наоборот.
Чтобы сообщить хранилищу, где находится рабочее дерево, задайте значение конфигурации
core.worktree
. Чтобы дать рабочему дереву знать, где находится его каталог git, добавьте файл с именем .git (не папка!) И добавьте строку вродеНачиная с git 1.7.5 команда init изучила дополнительную опцию для этого.
Вы можете инициализировать новый отдельный репозиторий с помощью
Это инициализирует репозиторий git в отдельном каталоге и добавит файл .git в текущий каталог, который является рабочим каталогом нового репозитория.
Раньше до 1.7.5 вам приходилось использовать немного другие параметры и добавлять файл .git самостоятельно.
Чтобы инициализировать отдельный репозиторий, следующая команда связывает рабочее дерево с репозиторием:
Ваш текущий каталог будет рабочим деревом, а git будет использовать хранилище по адресу
/path/to/repo.git
. Команда init автоматически установитcore.worktree
значение в соответствии с--git-dir
параметром.Вы могли бы даже добавить псевдоним для этого:
Использовать контроль версий git в рабочем каталоге только для чтения
Обладая знаниями выше, вы даже можете настроить контроль версий git для рабочего каталога, не имея прав на запись. Если вы используете
--git-dir
каждую команду git или выполняете каждую команду из репозитория (вместо рабочего каталога), вы можете пропустить файл .git и, следовательно, не нужно создавать какие-либо файлы в рабочем каталоге. Смотрите также ответ Леосаисточник
core.worktree
Разумеется, значение конфигурации хранится в файле конфигурации папки .git, на которую указывает файл .git.fatal: core.worktree and core.bare do not make sense
. Похоже, что просто изменение конфигурации, так что это не просто решает это.--separate-git-dir
Вариантgit init
(иgit clone
) может быть использован для достижения этой цели на мою версию мерзавца (1.7.11.3
). Опция отделяет репозиторий git от рабочего дерева и создает символическую ссылку git, независимую от файловой системы (в форме файла с именем.git
), в корне рабочего дерева. Я думаю, что результат идентичен ответу Никса .источник
init
себя выглядит яснее и чищеrepo.git
создается с установленным атрибутом hiden. Затем я изменяю это вручную. Вы случайно не знаете, безопасно ли это?Я считаю , что проще поменять местами
--work-tree
и--git-dir
каталоги , используемые в ответ Никс:Этот подход имеет два преимущества:
.git
файлы. Вы просто работаете в обычном режиме из корня хранилища.Единственное предостережение, с которым я столкнулся, это то, что вместо использования
.gitignore
файла вы редактируетеinfo/exclude
.Затем вы можете использовать хранилище
read_only_repos/foo
в качестве удаленного в своих собственных хранилищах, даже если исходные файлы не находятся под контролем версий.источник
Обычно принято называть каталог, являющийся репозиторием git, рабочее дерево которого находится в необычном месте с расширением .git, очень похожим на пустой репозиторий.
Если вы предоставили
--work-tree
опцию во время инициализации, то это автоматически настроило быcore.worktree
переменную config, которая означает, что git будет знать, где найти рабочее дерево, когда вы укажете каталог git.Но вы можете установить эту переменную и после факта.
Как только вы это сделаете, команда add должна работать как положено.
источник
Используйте
git
внутри репо:Отныне вы можете использовать
git
внутри./backup/git_repos/myfiles
каталога, без установки каких-либо переменных среды или дополнительных параметров.источник
warning: core.bare and core.worktree do not make sense
, значит ли это, что оно не сработало?core.bare
наfalse
потом.Вы можете создать скрипт "nodgit" (No Dot GIT) с чем-то вроде
Вы можете вызвать nodgit вместо git, и он при необходимости установит переменные, ища git-репо. Например, у вас есть (голое) хранилище в / usr / local / gits / __ home__foo_wibbles и вы находитесь в / home / foo / wibbles / one, тогда он найдет правильный рабочий каталог (/ home / foo / wibbles) и репо ,
О, вы также можете использовать «nodgit shell», чтобы получить оболочку с правильным набором переменных, чтобы вы могли использовать простые старые команды git.
источник
Предполагая, что ваши
myfiles
каталоги уже существуют и имеют некоторый контент, вы могли бы жить с этим:.git
Каталог будетbackup
, а не вmyfiles
.источник
git
отслеживать, используя.gitignore
файл. Если вы добавите*
и!myfiles
к нему, будет отслеживаться только этот каталог. Но если вы хотите отдельное хранилище для другого каталога, у вас возникнет проблема ...Я создаю сценарии, которые выглядят как
~ / Bin / ГИТ-слэш:
Использование --git_dir = $ GIT_DIR излишне, но напоминает мне, что я также могу устанавливать переменные окружения вне скрипта.
Приведенный выше пример предназначен для отслеживания локальных изменений системных файлов cygwin.
Может сделать один такой скрипт для любого крупного проекта, который нуждается в этом - но / без / .git - мое основное использование.
Вышеуказанное достаточно мало, чтобы создать псевдоним или функцию оболочки, если вы исключите избыточность.
Если бы я делал это достаточно часто, я бы восстановил рабочее пространство для отображения репозитория
ближайшим современным аналогом которого является выполнение отображений или представлений , поддержка частичных проверок, а также неколокация рабочего пространства и репо.
источник