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 в другом каталоге, не выходя из текущего каталога:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Методы, показанные выше, приемлемы для сценариев, но слишком громоздки для быстрых вызовов командной строки.

С помощью этой новой опции вышеупомянутое может быть сделано с меньшим количеством нажатий клавиш:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. 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"
Другие вопросы по тегам