Git-репозиторий с каталогом Git, хранящимся в другом месте - PullRequest
9 голосов
/ 12 октября 2010

Извините, если это дубликат, я искал в Google и SO и не смог найти ничего похожего, так как это достаточно общий набор слов для поиска!

Я хочу, чтобыкаталог .git должен находиться вне рабочего дерева.

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

Ответы [ 5 ]

8 голосов
/ 12 октября 2010

Вы можете явно указать путь к репозиторию git с помощью глобальной опции --git-dir для всех команд git.Когда вы используете эту опцию с init, она обычно создает пустой репозиторий, но если вы также укажите --work-tree, вы можете инициализировать непустой репозиторий с «отдельным» рабочим деревом.

git --git-dir=/var/repo/one.git --work-tree=/var/work/one init

Fromзатем, вам все равно придется предоставить либо опцию --git-dir, либо установить переменную окружения GIT_DIR, чтобы git знал, где находится репозиторий, поскольку в рабочем дереве нет никаких специфических данных для git, но рабочее дерево будет определеносоответственно из конфигурации git-репозитория.

6 голосов
/ 21 октября 2010

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

gitdir: <path-to-gitdir>

Естественно, вам сначала нужно переместить исходный каталог .git в его внешнее местоположение.

Все инструменты git с хорошим поведением соблюдают это, не полагаясь на переменные среды или механизмы, специфичные для ОС, такие как символические ссылки. Вы также должны иметь возможность размещать эти ссылки в произвольных местах в вашей иерархии каталогов, тем самым связываясь с несколькими хранилищами.

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

1 голос
/ 12 октября 2010

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

mkdir foobar
cd foobar
git init
export GIT_DIR=$PWD/.git
cd ..
mkdir wc
cd wc
echo foo > bar.txt
git add .
git commit
1 голос
/ 12 октября 2010

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

Однако это возможно: используя git-config, вы можете указать git использовать другой каталог, отличный отодин, содержащий .git, в качестве корня рабочего дерева.

Если вы запустите git init один каталог над корневым каталогом foo другого проекта, то вы можете использовать:

git config core.worktree ../foo

Где ../foo - это путь проекта foo относительно вашего каталога .git.

Однако при относительном пути инструменты git будут работать только в родительском каталогеfoo, больше нигде в дереве.Используя абсолютный путь, вы избегаете этого (но не забудьте изменить его, если вы когда-либо перенесете свой проект).

0 голосов
/ 12 октября 2010

Я не знаю, возможно ли это, я довольно новичок в VCS.

Но вы можете сказать другим VCS игнорировать файлы, для CVS создайте файл .cvsignore:

.git
*ignore_me*

для использования SVN

$ svn propset svn:ignore -F .cvsignore .

Надеюсь, это поможет.

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