git pull пока не в каталоге git
Допустим, у меня есть каталог, /X/Y
, который является хранилищем git. Можно ли как-то вызвать команду вроде git pull
изнутри /X
, но нацеливание на /X/Y
каталог?
РЕДАКТИРОВАТЬ: я думаю, что мне было интересно: возможно ли это сделать с помощью команды git, но без необходимости менять каталоги?
ПРИМЕЧАНИЕ: я принял ответ VonC, так как он намного элегантнее предыдущих вариантов. Если вы пользуетесь Git старше 1.8.5, см . Ответ bstpierre ниже.
9 ответов
Начиная с git 1.8.5 (4 квартал 2013 года), вы сможете "использовать команду Git, но без необходимости менять каталоги".
Как "
make -C <directory>
", "git -C <directory> ...
"говорит Git пойти туда, прежде чем делать что-либо еще.
Смотрите коммит 44e1e4 от Назри Рамлия:
Требуется больше нажатий клавиш для вызова команды Git в другом каталоге, не выходя из текущего каталога:
(cd ~/foo && git status)
git --git-dir=~/foo/.git --work-tree=~/foo status
GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status(cd ../..; git grep foo)
for d in d1 d2 d3; do (cd $d && git svn rebase); done
Методы, показанные выше, приемлемы для сценариев, но слишком громоздки для быстрых вызовов командной строки.
С помощью этой новой опции вышеупомянутое может быть сделано с меньшим количеством нажатий клавиш:
git -C ~/foo status
git -C ../.. grep foo
for d in d1 d2 d3; do git -C $d svn rebase; done
Начиная с Git 2.3.4 (март 2015 г.) и коммит 6a536e2, Картик Наяк ( KarthikNayak
), git
будем лечить git -C '<path>'
"как неоперативный, когда <path>
пустой.
'
git -C ""
"бесполезно умирает с ошибкой"Cannot change to ''
", в то время как оболочка рассматривает cd" "'как no-op.
Принимая поведение оболочки в качестве прецедента, учитьgit
трактовать -C ""'как неактивное, а также.
Редактировать:
Там либо ошибка с git pull
или вы не можете делать то, что пытаетесь сделать с помощью этой команды. Однако вы можете сделать это с помощью fetch и merge:
cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master
Оригинальный ответ:
Предполагая, что вы используете Bash или аналогичный, вы можете сделать (cd /X/Y; git pull)
,
Страница man git указывает некоторые переменные (см. "Репозиторий git"), которые, похоже, должны помочь, но я не могу заставить их работать правильно (с моим репозиторием в /tmp/ggg2):
GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
Выполнение команды ниже, в то время как мой cwd является / tmp, обновляет этот репозиторий, но обновленный файл появляется в / tmp вместо рабочего дерева /tmp/ggg2:
GIT_DIR=/tmp/ggg2/.git git pull
Смотрите также этот ответ на аналогичный вопрос, который демонстрирует --git-dir
а также --work-tree
флаги.
Вы можете заключить его в скрипт bash или в псевдоним git:
cd /X/Y && git pull && cd -
Этот пост немного староват, поэтому, возможно, там была ошибка, и она была исправлена, но я просто сделал это:
git --work-tree=/X/Y --git-dir=/X/Y/.git pull origin branch
И это сработало. Мне потребовалась минута, чтобы понять, что ему нужны точечный файл и родительский каталог (в стандартной настройке это всегда родитель / потомок, но не во ВСЕХ установках, поэтому их нужно указывать явно.
Поскольку некоторые из моих серверов работают на старых версиях Ubuntu LTS, я не могу легко обновить git до последней версии (которая поддерживает опцию -C, как описано в некоторых ответах).
Этот трюк хорошо работает для меня, особенно потому, что у него нет побочного эффекта некоторых других ответов, которые оставляют вас в другом каталоге, с которого вы начали.
pushd /X/Y
git pull
popd
Или, делая это как однострочник:
pushd /X/Y; git pull; popd
В Linux и Windows есть команды pushd и popd.
Используя комбинацию pushd
, git pull
а также popd
Мы можем достичь этой функциональности:
pushd <path-to-git-repo> && git pull && popd
Например:
pushd "E:\Fake Directory\gitrepo" && git pull && popd
Вы можете написать скрипт так:
cd /X/Y
git pull
Вы можете назвать это как gitpull
,
Если вы предпочитаете делать произвольные каталоги вместо /X/Y
:
cd $1
git pull
Тогда вы можете позвонить с gitpull /X/Z
Наконец, вы можете попробовать найти репозитории. у меня есть ~/git
папка, которая содержит репозитории, и вы можете использовать это, чтобы сделать все из них.
g=`find /X -name .git`
for repo in ${g[@]}
do
cd ${repo}
cd ..
git pull
done
Для любого, как я, который пытался сделать это с помощью команды drush (оболочка Drupal) на удаленном сервере, вы не сможете использовать решение, которое требует от вас CD в рабочий каталог:
Вместо этого вам нужно использовать решение, которое разбивает тягу на извлечение и объединение:
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH fetch origin
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH merge origin/branch
Это может быть похожая проблема, но вы также можете просто связать команды. например
На одной линии
cd ~/Sites/yourdir/web;git pull origin master
Или через SSH.
ssh username@atyourserver.com -t "cd ~/Sites/thedir/web;git pull origin master"