2010-10-12 2 views
9

Прошу прощения, если это дубликат, я искал google и SO и не мог найти ничего подобного, так как это довольно общий набор слов для поиска!Репозиторий Git с git-каталогом, хранящимся в другом месте

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

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

+1

Не можете ли вы настроить другое программное обеспечение для управления версиями, чтобы игнорировать эту директорию .git? Что такое другой VCS? – Vinzenz

+0

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

+0

Извините, забыли сказать: VCS ... не нормальный. Предположим, что это собственность. –

ответ

8

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

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

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

+0

Как и другие ответы, но это задает дерево работы, поэтому мне не нужно каждый раз запоминать cd для root. Я тоже поддержал остальных. Огромное спасибо! –

1

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

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

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

git config core.worktree ../foo 

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

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

+0

Это также работает, чтобы ** modifiy ** worktree впоследствии (если вы переместили его) - однако, странно, что исходный каталог рабочего дерева (существует пустой каталог). – giraff

0

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

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

.git 
*ignore_me* 

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

$ svn propset svn:ignore -F .cvsignore . 

Надеется, что это помогает.

1

Я не совсем уверен, если это хороший совет, но вы можете установить переменную среды 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 
6

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

gitdir: <path-to-gitdir> 

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

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

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

Смежные вопросы