git: Как добавить внешний каталог в репозиторий?

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

Внешний каталог: /home/some/directory

Рабочий каталог: /htdocs/.git

Если я попытаюсь выполнить следующую команду из каталога /htdocs:

git добавить /home/some/directory

Я получаю сообщение об ошибке: фатально: '/home/some/directory' находится вне репозитория


person Community    schedule 05.03.2010    source источник
comment
Чего вы на самом деле хотите? Мне кажется, что вы хотите что-то в своем репозитории, но не в своем репозитории.   -  person jdizzle    schedule 08.03.2010
comment
Является ли сам внешний каталог репозиторием, в который вы также хотите объединять журналы?   -  person saeedgnu    schedule 01.05.2011
comment
см. stackoverflow.com/questions/6392862/git-stash-worktree-woes   -  person basZero    schedule 17.02.2012


Ответы (9)


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

mv /home/some/directory /htdocs/directory
ln -s /htdocs/directory /home/some/
git add ./directory

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

person csexton    schedule 08.03.2010
comment
У меня это вообще не работает в Mac OS X 10.10.3. В основном Wordpress не распознает каталог или файлы плагинов с символической ссылкой, и они не отображаются в списке плагинов WP. Я что-то упускаю? - person Adam Christianson; 05.05.2015
comment
С smb поделитесь какой-нибудь идеей? Я хочу синхронизировать закладки Firefox с помощью git. - person Matthis Kohli; 14.05.2018
comment
Это потрясающе. Я попытался сделать символическую ссылку в другом направлении, и git закатил истерику. ;) - person zx81; 08.04.2019

У меня была такая же ошибка... Погуглил до смерти... мало что вышло.

Ответ Кристиана сработал:

git --work-tree=/ add /home/some/directory

Но потом «рабочее дерево» заставило меня завестись. Я проверил всю документацию Git и придумал core.worktree.

я использовал

git config --global core.worktree /

И вуаля! Теперь я могу добавлять файлы из любого каталога в системе. Я не знаю, вызовет ли это проблемы в других местах, но я постараюсь обновить по мере продвижения.

person MotherDawg    schedule 24.12.2011
comment
Вы хотели написать, что теперь я могу добавить из любого каталога в системе.? Просто любопытно, редактор во мне так сильно хочет отредактировать твой ответ. :П - person Will Lanni; 20.02.2014
comment
Да, видел, вот что делает с вами легкая степень дислексии... ваш мозг уже закончил абзац и делает что-то еще, пока ваши пальцы все еще находятся в середине. (Извините за задержку с ответом) - person MotherDawg; 13.11.2014
comment
Так что я не могу сделать git add * :P - person Nishant; 19.05.2015
comment
Я не уверен, что произошло, но после попытки GitHub больше не мог найти мой репозиторий, а затем произошел сбой. - person StarSweeper; 28.04.2017
comment
Аналогичный ответ stackoverflow.com/a/8040817/5459638 содержит другие комментарии к git --work-tree=/ add /home/some/directory - person XavierStuvw; 01.07.2020
comment
После осторожности может быть лучше не экспериментировать с /, а выбрать тестовый каталог внутри вашего каталога /home/user. А также поиграйте с вашим локальным репо, используя --local, кстати, по умолчанию, вместо --global - person XavierStuvw; 01.07.2020

Для этого есть действительно простое решение.

Допустим, ваш репозиторий Git находится в /var/data/my-app, и вы хотите добавить /var/data/public/ в этот репозиторий. Вы не можете использовать «добавить», потому что Git не будет добавлять ресурсы вне корневого каталога репо. Так..

Решение:

  1. Переместите каталог /var/data/public/ в корень Git-репозитория (/var/data/my-app).

  2. Создайте символическую ссылку (символическую ссылку) внутри /var/data/public на папку /var/data/my-app/public, используя: ln -s source_file_or_directory virtual_file_or_directory

Затем просто добавьте перемещенный файл или каталог в Git, используя git add обычным способом. Ваш контроль исходного кода Git теперь отслеживает нужный файл/папку, а ваша символическая ссылка во внешнем каталоге гарантирует, что файл/папка доступна для чего угодно!

person Stormbytes    schedule 01.05.2011
comment
на самом деле это ничего не отслеживает в целевом каталоге. Он просто отслеживает ссылку. Правильно? - person incandescentman; 14.02.2014
comment
@PeterSalazar нет, так как Stormbytes предложил переместить целевой каталог в репозиторий git. Символическая ссылка сохраняет исходное местоположение. Если бы вы добавили ссылку в репо, вы были бы правы. - person shiri; 09.12.2014
comment
Это не сработает, если несколько пользователей используют один и тот же компьютер для участия в одном и том же проекте git. Пример: предположим, что на одном компьютере есть два пользователя: U и T. U символически связал каталог /var/linked где-то внутри своей домашней папки. Другой пользователь Т хочет отредактировать какой-то файл в каталоге /var/linked, но у него должны быть на это права. Даже если у T есть разрешение на запись в связанный каталог U, T будет редактировать рабочую копию из репозитория U. - person gagallo7; 24.03.2016

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

В моем случае мне, например, нужен один файл R, который я довольно часто модифицирую, в нескольких репозиториях, и я написал небольшой сценарий оболочки:

#!/usr/bin/env bash

cp -r /some/directory/file.R .
git add .
git commit -m "add"
git push

... и я запускаю этот скрипт, чтобы отправить все изменения, в том числе и в /some/directory.

person Christian Tischer    schedule 06.05.2017

Это заставило меня задуматься, так как мне очень хотелось бы использовать символическую ссылку на файл/каталог, но я застрял на компьютере с Windows. Насколько я знаю, символические ссылки в Windows на самом деле не работают таким же образом. Таким образом, другим решением может быть написание двух функций script/bash для «импорта» и «экспорта» рассматриваемых файлов, например:

import() {
    cp -fr /home/some/directory /htdocs/
}

export() {
    cp -fr /htdocs/directory /home/some/
}

Тогда у вас будет копия файла в вашем репозитории, которую вы сможете git add.

person Tubbles    schedule 03.08.2018

Или вы можете использовать подмодуль, если хотите работать с разными репозиториями git (ln не работает таким образом). Попробуйте «man git-submodule».

person superarts.org    schedule 07.09.2012
comment
Я только что взглянул на это, но наличие подмодуля вне его родительского репо выглядит уродливее, чем просто наличие двух репозиториев, особенно для кого-то, кто извлекает из репо внешний подмодуль. Вы (или кто-либо) действительно использовали это? - person mikeLundquist; 05.08.2018

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

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

.
├── 2A94M5J1Z
│   └── note.json
├── 2G2U2ZR1T
│   └── note.json
├── conf
│   ├── shiro.ini
│   ├── zeppelin-env.sh
│   └── zeppelin-site.xml
└── README.md
person JUNPA    schedule 14.03.2021

Добавьте символическую ссылку на каталог в репозитории. Затем добавьте то же самое.

ln -s /home/some/directory/
git add directory
person Alan Haggai Alavi    schedule 05.03.2010
comment
Но на самом деле это ничего не отслеживает в целевом каталоге. Он просто отслеживает ссылку. - person William Pursell; 05.03.2010
comment
Итак, как мне рекурсивно отслеживать все в целевом каталоге? - person ; 05.03.2010
comment
Он просто отслеживает ссылку, как указано в ответе выше, если кто-то еще клонирует репо, он получает ссылку, указывающую «никуда» (или, что еще хуже, «куда-то»). - person Tomas Pruzina; 19.03.2013

person    schedule
comment
Это немного объясняет: stackoverflow.com/questions/5283262/ хотя мне не ясно, что кто-то получить, если они клонировали это репо - person Sam Hasler; 23.04.2014
comment
Это также делает написание .gitignore очень сложным, а git status и git add --a удалят файлы за пределами рабочего каталога git. Вы можете установить рабочий каталог в качестве параметра локального репозитория, но по умолчанию это будет отслеживать все в заданном каталоге. Что снова потребует помощи gitignore. Больше проблем, чем оно того стоит. - person Ray Foss; 10.06.2015
comment
Другие комментарии к этому решению см. на stackoverflow.com/a/8626989/5459638 на этой доске обсуждений. - person XavierStuvw; 01.07.2020