Странности с push и pull в Git

218 views
Skip to first unread message

1g0rrr

unread,
Dec 5, 2008, 5:25:41 AM12/5/08
to RubyOnRails to russian
Здравствуйте. Разбираюсь сейчас с Git и застрял на командах push pull.
В примере упростил все до минимума. Есть две пустые папки one/, two/.
В обоих выполнил "git init". Положил в первую папку файл test.txt,
закомитил, перешел в папку two/, и сделал "git pull ../one", как и
ожидалось, файл test.txt появился в two/. В two изменяю этот файл.
Делаю "git push ../one", операция выполняется успешно, но в one/ файл
test.txt остался без изменений...
"git status", выполненный в one, говорит, что файл test.txt изменен. В
ожидании того, что файл изменится, делаю коммит в one. Коммит успешно
выполняется, но файл остается неизмененным. Непонятно что нужно
сделать, чтобы принять изменения переданные с push.
И еще вопросы:
1) Какова правильная последовательность выполнения push? Можно ли
настроить репозиторий так, чтобы при заливании с помощью push файлы на
целевом репозитории изменялись сразу же?
2) Можно ли вызвать pull, или push из другого места, не из директории
проекта? Например мне нужно, чтобы репозиторий обновлялся
автоматически, раз в час и я хочу поместить эту команду в крон.

Anton Dyachuk

unread,
Dec 5, 2008, 5:51:29 AM12/5/08
to ror...@googlegroups.com
В сообщении от Friday 05 December 2008 13:25:41 1g0rrr написал(а):

> Здравствуйте. Разбираюсь сейчас с Git и застрял на командах push pull.
> В примере упростил все до минимума. Есть две пустые папки one/, two/.
> В обоих выполнил "git init". Положил в первую папку файл test.txt,
> закомитил, перешел в папку two/, и сделал "git pull ../one", как и
> ожидалось, файл test.txt появился в two/. В two изменяю этот файл.
> Делаю "git push ../one", операция выполняется успешно, но в one/ файл
> test.txt остался без изменений...

Что-то мне кажется ты какой-то хренью занимаешься. Ты создал 2 разных
репозитория и что-то непонятное пытаешься с ними сотворить.

> 1) Какова правильная последовательность выполнения push? Можно ли
> настроить репозиторий так, чтобы при заливании с помощью push файлы на
> целевом репозитории изменялись сразу же?

1. Работаешь-меняешь файлы
2. git add . (в случае если в комит у тебя входят все измененные файлы)
3. git commit -m "my cool changes"
4. git push
5. PROFIT

> 2) Можно ли вызвать pull, или push из другого места, не из директории
> проекта? Например мне нужно, чтобы репозиторий обновлялся
> автоматически, раз в час и я хочу поместить эту команду в крон.

Что мешает сделать cd /path/to/proj; git pull ?

--
With Best Regards, Anton Dyachuk <anton....@gmail.com>

Dmitriy Dzema

unread,
Dec 5, 2008, 5:59:20 AM12/5/08
to ror...@googlegroups.com

On 05.12.2008, at 20:25, 1g0rrr wrote:
>
> "git status", выполненный в one, говорит, что
> файл test.txt изменен. В
> ожидании того, что файл изменится,
> делаю коммит в one. Коммит успешно
> выполняется, но файл остается
> неизмененным. Непонятно что нужно
> сделать, чтобы принять изменения
> переданные с push.

после того как запушили из папки2, в
папке 1 надо сделать чекаут.

Ol.keene

unread,
Dec 5, 2008, 6:36:18 AM12/5/08
to RubyOnRails to russian
можно, git/hooks/post-update
ex, http://retis.sssup.it/~scordino/projects/post-update.html

1g0rrr

unread,
Dec 5, 2008, 7:48:50 AM12/5/08
to RubyOnRails to russian
On 5 дек, 13:51, Anton Dyachuk <anton.dyac...@gmail.com> wrote:
> Что-то мне кажется ты какой-то хренью занимаешься. Ты создал 2 разных
> репозитория и что-то непонятное пытаешься с ними сотворить.

Это для примера создал, пытаюсь понять как работает push. Можно было
сделать и git clone, но проблема остается та же. После того как делаю
пуш, репозиторий которому передаю этот пуш не изменяется, хотя в git
status изменения есть.

> 1. Работаешь-меняешь файлы
> 2. git add . (в случае если в комит у тебя входят все измененные файлы)
> 3. git commit -m "my cool changes"
> 4. git push
> 5. PROFIT

Да, так во всех инструкциях и пишут, я так и делаю. Но, что должно
быть на месте prifit? Может я не так понимаю идеологию git, но когда я
делаю push на какой-то репозиторий, то ожидаю, что он примет мои
изменения и изменится в соответствии с ними (как-бы противоположность
команде pull)

Max Lapshin

unread,
Dec 5, 2008, 7:51:35 AM12/5/08
to ror...@googlegroups.com
Ты когда делаешь пуш, меняется содержимое папки .git того репозитория, куда ты заливаешь. Т.е. меняется сам репозиторий. А вот привязанная к нему рабочая версия меняться совершенно не обязана, поэтому она отображается как измененная,
но при этом с изменениями полностью обратными к твоим.

И не насилуй ты себе мозг такой конфигурацией, тем более, что тебе уже всё объяснили.

Dmytro Shteflyuk

unread,
Dec 5, 2008, 7:52:05 AM12/5/08
to ror...@googlegroups.com
2008/12/5 1g0rrr <1g0r...@gmail.com>:

> Да, так во всех инструкциях и пишут, я так и делаю. Но, что должно
> быть на месте prifit? Может я не так понимаю идеологию git, но когда я
> делаю push на какой-то репозиторий, то ожидаю, что он примет мои
> изменения и изменится в соответствии с ними (как-бы противоположность
> команде pull)

Ты путаешь репозитарий и рабочую копию. Репо - это то, что в каталоге
.git. Файлы, которые ты редактируешь - это рабочая копия. Чтобы их
обновить нужно сделать git pull.
--
Best regards, Dmytro Shteflyuk
http://kpumuk.info/

1g0rrr

unread,
Dec 5, 2008, 7:56:38 AM12/5/08
to RubyOnRails to russian

Делаю чекаут в папке 1. Он видит, что мой файл изменялся, но сам файл
остается таким, какой и был.
M test.txt
Если вызвать чекаут еще раз, то сообщение остается таким же точно.
Если сделать потом коммит, и потом еще раз чекаут, тоже эфекта нет.
git status говорит, что изменений уже нет. А мой файл так и остался
неизменным..

serho

unread,
Dec 5, 2008, 8:02:11 AM12/5/08
to RubyOnRails to russian
в папке one
git checkout -- добавятся новые файлы
git checkout -f -- добавятся новые и изменятся существующие

1g0rrr

unread,
Dec 5, 2008, 8:17:54 AM12/5/08
to RubyOnRails to russian
On 5 дек, 15:51, "Max Lapshin" <max.laps...@gmail.com> wrote:
> А вот привязанная к нему
> рабочая версия меняться совершенно не обязана, поэтому она отображается как
> измененная,
> но при этом с изменениями полностью обратными к твоим.
Да, так и происходит.

> И не насилуй ты себе мозг такой конфигурацией, тем более, что тебе уже всё
> объяснили.

Что вы понимаете под конфигурацией? Подскажите правильную
конфигурацию.
Я, к сожалению, никак не могу никак понять, что должен делать push. Я
пересылаю изменения и меняется содержимое .git, который и есть
репозиторий. Хорошо. А как мне теперь применить изменения этого
репозитория к моей рабочей версии? С помощью какой команды? "git
pull ../two" и "git pull . " говорят, что Already up-to-date.

Max Lapshin

unread,
Dec 5, 2008, 8:21:07 AM12/5/08
to ror...@googlegroups.com
Наиболее используемая схема использования гита — gitosis на сервере или github,
после чего тот репозиторий клонируется, делается pull с него, push на него.
Но сам bare репозиторий, т.е. тот который на сервере, живет без рабочей копии и в нём никто не работает.

Тебе же вовсе не нужен второй репозиторий, если ты работаешь без сервера. Коммить в свой репозиторий и в нём
веди историю версий.

serho

unread,
Dec 5, 2008, 8:23:36 AM12/5/08
to RubyOnRails to russian
Еще раз. Для изменений в рабочей папке

git checkout -- добавятся новые файлы
git checkout -f -- добавятся новые и изменятся существующие

1g0rrr

unread,
Dec 5, 2008, 8:36:53 AM12/5/08
to RubyOnRails to russian
On 5 дек, 16:02, serho <sergei.homja...@gmail.com> wrote:
> в папке one
> git checkout -- добавятся новые файлы
> git checkout -f -- добавятся новые и изменятся существующие

Ура! "git checkout -f" изменил этот test.txt!
Вообще изначально у меня ситуация такая. У меня есть некоторое веб
приложение, которое я пишу сам. Есть удаленный сервер, на котором оно
будет выполнятся. Мне нужно, чтобы изменения, которые я делаю в одной
из веток, переносились на этот сервер. Я это себе представлял так, что
я делаю push и изменения сразу же заливаются на удаленный сервер т.е.
все скрипты синхронизируются. Но т.к. на стороне сервера нужно делать
checkout -f для применения изменений, то это составляет некоторые
неудобства. Прийдется видимо ставить эту команду в крон, и изменения
будут заливаться через некоторый период, или заходить через ssh и
выполнять ее.

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

Михаил Лапшин

unread,
Dec 5, 2008, 8:57:03 AM12/5/08
to ror...@googlegroups.com
Нужно сделать 2 репозитория: первый центральный, второй - рабочая копия для веб-сервера. В центральном репозитории сделать post-receive хук с примерно следующим содержанием:

unset GIT_DIR
cd /path/to/production/repo/
git pull

И никакие кроны тут нафиг не нужны.

2008/12/5 1g0rrr <1g0r...@gmail.com>

Dmitry Shaposhnik

unread,
Dec 5, 2008, 9:03:30 AM12/5/08
to ror...@googlegroups.com
Я бы за такой подход руки тупым ножом
отпиливал. По горло.

Итак, есть в хомах/на_гитхабе/
в_гитозисе/хз_где_еще репозиторий,
который используете Вы. Подумайте, что
когда-нибудь к Вам присоединится еще
один (а то и не один) разработчик.

Так вот, в этот репозиторий попадают
Ваши изменения. Репозиторий там - не
тупо git init, а git init --bare.

Потом с ним идет общение, в него все
пушается.

Когда надо выложить сайт - и Вы уверены
что в текущей сборке все корретно -
делается cap deploy (RTFM capistrano), который из
репозитория вытягивает свеженькую
версию, обновляет работающее
приложение и РЕСТАТРТУЕТ его (о чем Вы,
вероятно, забыли - файлы в production-mode
перечитываться-то не будут). Если это
passenger - то что-то вроде touch $APP/tmp/restart.txt,
если монгрели - то рестартовать их.
А также Вы забыли что запушить можно и
миграции, которые ну никоим боком не
выполнятся сами по себе ;)

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

Резюме: используйте git init --bare / gitosis,
деплойте с помощью capistrano (либо своими
скриптами).

ЗЫ: еще пробегала мысль о post-* hooks.
---
Best wishes, Dmitry

Maxim Kulkin

unread,
Dec 5, 2008, 9:24:15 AM12/5/08
to ror...@googlegroups.com
А кому надоели пляски с Git могу предложить посмотреть на Darcs второй
версии. Там для работы не обязательно запоминать и использовать
всевозможные ключи к командам.

5 декабря 2008 г. 16:36 пользователь 1g0rrr <1g0r...@gmail.com> написал:

Julik Tarkhanov

unread,
Dec 5, 2008, 9:28:34 AM12/5/08
to ror...@googlegroups.com

On Dec 5, 2008, at 2:36 PM, 1g0rrr wrote:

> Как бы вы реализовали такую задачу,
> когда надо просто залить изменения
> на сервер, зная, что кроме вас к коду
> никто не будет иметь доступ?


капистраной
--
Julik Tarkhanov
m...@julik.nl





Dmitriy Dzema

unread,
Dec 5, 2008, 10:04:40 AM12/5/08
to ror...@googlegroups.com

On 05.12.2008, at 23:02, serho wrote:

> в папке one
> git checkout -- добавятся новые файлы
> git checkout -f -- добавятся новые и
> изменятся существующие

Спасибо за поправку. Все эти ключики
просто на автоматическом уровне
печатаются после некоторой тренировки
Еще аналогично git checkout -f действует git
checkout .
Reply all
Reply to author
Forward
0 new messages