Могу ли я выполнять операции git (добавить/diff/commit) на файлы в репозитории, когда мой текущий каталог не находится в репозитории
С помощью svn я смог запускать команды в файлах в кассе, не имея при этом cd
в этой проверке. Например:
# Located in /tmp, running svn operation on /home/d5ve/checkout
[email protected]:/tmp> svn add /home/d5ve/checkout/myfile.txt
[email protected]:/tmp> svn diff /home/d5ve/checkout/myfile.txt
[email protected]:/tmp> svn commit /home/d5ve/checkout/myfile.txt
Когда я пытаюсь выполнить этот рабочий процесс с помощью git, я получаю сообщение об ошибке:
# Located in /tmp, attempting git operation on /home/d5ve/checkout2
[email protected]:/tmp> git add /home/d5ve/checkout2/myfile.txt
fatal: Not a git repository (or any of the parent directories): .git
Я пробовал использовать флаги --git-dir
и --work-tree
, но, похоже, это тоже не сработало.
Любые предложения git люди? Я часто использую этот рабочий процесс и очень скучаю при использовании git.
UPDATE 2016 Текущий правильный ответ на этот вопрос - использовать флаг -C
для git, который был введен в версии 1.8.5 в 2013 году. См. qaru.site/info/159031/...
ОБНОВЛЕНИЕ: Основываясь на ответе lunaryorn ниже, я создал простой perl script, который выдает расположение каталога .git из путей к файлу и устанавливает условия GIT_WORK_TREE и GIT_DIR переменные для команды.
Пожалуйста, взгляните на: http://github.com/d5ve/rgit
ИСПОЛЬЗОВАНИЕ: rdit COMMAND [ARGS]
В основном просто замените git на rgit в команде, и вы можете запускать команды извне репозитория.
cd /tmp
rgit diff /home/d5ve/checkout1
rgit add /home/d5ve/checkout1/rgit.pl
rgit commit /home/d5ve/checkout1/
Ответы
Ответ 1
Вы должны использовать оба варианта вместе:
git --git-dir=/home/d5ve/checkout2/.git --work-tree=/home/d5ve/checkout2/ add /home/d5ve/checkout2/myfile.txt
Обратите внимание, что --git-dir
не ссылается на каталог, содержащий рабочую копию, но на подкаталог .git
, который содержит сам репозиторий. git предоставляет две переменные среды для постоянной установки этих параметров для сеанса:
export GIT_WORK_TREE="/home/d5ve/checkout2"
export GIT_DIR="${GIT_WORK_TREE}/.git"
git status
Ответ 2
Пожалуйста, проверьте этот немного другой вопрос, который имеет ответ, отлично работающий, отличный от обходного пути, предложенного в другом ответе здесь.
Как выполнить команду Git, не находясь в папке репозитория?
По словам какого-то модератора, мне не разрешено публиковать ответ здесь (какой-то поклонник Чака Норриса, я думаю).