Настройка непустого удалённого git репозитория

IDE, VCS и прочее

Модератор: Модераторы разделов

Ответить
vovansystems
Сообщения: 25

Настройка непустого удалённого git репозитория

Сообщение vovansystems »

Долго и упорно читал доки по git, но такое чувство что что-то упускаю. Хочу на продакшн сервере настроить репозиторий чтобы можно было через него выкладывать изменения. Т.е. архитектура - мой комп - удалённый непустой репозиторий на продакшн-сервере. С gitosis у меня не всё получилось, поэтому сейчас пробую без него - возник один вопрос:

сервер debian:

Код: Выделить всё

aptitude install git-core
adduser git
su git
cat /tmp/id_rsa.my.pub >> ~/.ssh/authorized_keys
cd /home/user/domains/domain.com
git init
git add .
git commit -am "first commit"
git push


и тут получаю ответ:

Код: Выделить всё

fatal: 'origin': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly


тогда делаю:

Код: Выделить всё

git remote add origin git@domain.com:/home/user/domains/domain.com
Everything up-to-date



локальный комп:

Код: Выделить всё

git clone git@domain.com:/home/user/domains/domain.com
cd domain.com
vi public_html/footer.php
git commit -am "change date"
git push origin master


сервер:

Код: Выделить всё

git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   public_html/footer.php
#

git pull

From git@domain.com:/home/user/domains/domain.com
 * [new branch]      master     -> origin/master
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = <nickname>
    branch.master.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

вот тут непонятно. он спрашивает с какой веткой склеивать. дальше как бы я ему не отвечал всё равно ничего не меняется:

Код: Выделить всё

git pull origin master

From git@domain.com:/home/user/domains/domain.com
 * branch            master     -> FETCH_HEAD
Already up-to-date.

git pull origin master:master
Already up-to-date.

git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   public_html/footer.php
#

Вопрос: что я делаю не так?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Настройка непустого удалённого git репозитория

Сообщение watashiwa_daredeska »

user@localhost

~$ mkdir ~/tmp/repo && cd ~/tmp/repo ~/tmp/repo$ echo 'Test repository' >README ~/tmp/repo$ git init Initialized empty Git repository in /home/user/tmp/repo/.git/ ~/tmp/repo$ git add . ~/tmp/repo$ git commit -am 'Initial commit' [master (root-commit) a9f637a] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 README ~/tmp/repo$ git clone --bare . repo.git Cloning into bare repository repo.git... done. ~/tmp/repo$ mv repo.git/hooks/post-update{.sample,} ~/tmp/repo$ scp -r repo.git server:. description 100% 73 0.1KB/s 00:00 f637a0a22ce5bc01d30bb8a3008e17a668c9f1 100% 133 0.1KB/s 00:00 edd3597c4b244fc7a40138000a25e679c2f53a 100% 51 0.1KB/s 00:00 2920f365f6862a5528533845f4003396edadcd 100% 32 0.0KB/s 00:00 HEAD 100% 23 0.0KB/s 00:00 config 100% 115 0.1KB/s 00:00 pre-rebase.sample 100% 4951 4.8KB/s 00:00 prepare-commit-msg.sample 100% 1239 1.2KB/s 00:00 pre-commit.sample 100% 1578 1.5KB/s 00:00 post-receive.sample 100% 552 0.5KB/s 00:00 post-update 100% 189 0.2KB/s 00:00 commit-msg.sample 100% 896 0.9KB/s 00:00 update.sample 100% 3611 3.5KB/s 00:00 pre-applypatch.sample 100% 398 0.4KB/s 00:00 post-commit.sample 100% 160 0.2KB/s 00:00 applypatch-msg.sample 100% 452 0.4KB/s 00:00 exclude 100% 240 0.2KB/s 00:00 packed-refs 100% 85 0.1KB/s 00:00 ~/tmp/repo$ git remote add origin ssh://server/~/repo.git ~/tmp/repo$ rm -rf repo.git


Ну, а потом можно уже:

user@localhost

~/tmp/repo$ git pull origin master From ssh://server/~/repo * branch master -> FETCH_HEAD Already up-to-date. ~/tmp/repo$ echo 'Just testing' >>README ~/tmp/repo$ git commit -am 'Some changes' [master 99b78c8] Some changes 1 files changed, 1 insertions(+), 0 deletions(-) ~/tmp/repo$ git push Counting objects: 5, done. Writing objects: 100% (3/3), 274 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh://server/~/repo.git a9f637a..99b78c8 master -> master

Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Настройка непустого удалённого git репозитория

Сообщение watashiwa_daredeska »

Ну, или еще один вариант, создаем пустой репозиторий прямо на сервере:

user@localhost

~$ mkdir ~/tmp/repo && cd ~/tmp/repo ~/tmp/repo$ echo 'Test repository' >README ~/tmp/repo$ git init Initialized empty Git repository in /home/user/tmp/repo/.git/ ~/tmp/repo$ git add . ~/tmp/repo$ git commit -am 'Initial commit' [master (root-commit) 8d67400] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 README ~/tmp/repo$ ssh server 'mkdir repo.git; cd repo.git; git init --bare; chmod +x hooks/post-update' Initialized empty Git repository in /home/user/repo.git/ ~/tmp/repo$ git remote add origin ssh://server/~/repo.git ~/tmp/repo$ git config --add branch.master.merge master ~/tmp/repo$ git config --add branch.master.remote origin ~/tmp/repo$ git push Counting objects: 3, done. Writing objects: 100% (3/3), 232 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh://server/~/repo.git * [new branch] master -> master ~/tmp/repo$ git pull Already up-to-date.


а потом:

user@localhost

~/tmp/repo$ echo 'Just for test' >>README ~/tmp/repo$ git commit -am 'Some changes' [master c25ee11] Some changes 1 files changed, 1 insertions(+), 0 deletions(-) ~/tmp/repo$ git push Counting objects: 5, done. Writing objects: 100% (3/3), 273 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh://server/~/repo.git 8d67400..c25ee11 master -> master

Спасибо сказали:
vovansystems
Сообщения: 25

Re: Настройка непустого удалённого git репозитория

Сообщение vovansystems »

watashiwa_daredeska писал(а):
10.01.2011 16:19
Ну, или еще один вариант, создаем пустой репозиторий прямо на сервере:

но я так понимаю что в обоих вариантах на сервере будет размещаться пустой репозиторий. т.е. если на сервере сделать git pull, то файл README на сервере не изменится - его просто не существует вне каталога repo.git? правильно ли я понимаю?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Настройка непустого удалённого git репозитория

Сообщение watashiwa_daredeska »

vovansystems писал(а):
10.01.2011 17:09
что в обоих вариантах на сервере будет размещаться пустой репозиторий
К концу операции — не пустой. В первом варианте он вообще никогда не пустой, т.к. сразу делается клонированием непустого репозитория, а во втором в созданный пустой репозиторий сразу делается git push.

vovansystems писал(а):
10.01.2011 17:09
если на сервере сделать git pull
А зачем на сервере делать git pull? На сервере должен быть bare репозиторий, в который делается только git push с рабочих машин и git pull из него на рабочие машины.

vovansystems писал(а):
10.01.2011 17:09
файл README на сервере не изменится - его просто не существует вне каталога repo.git?
Его и в каталоге repo.git не существует. В repo.git — bare репозиторий, без рабочего каталога. README в нем существует только в виде object'а. Посмотрите на список файлов, которые копируются по scp на сервер в первом случае: файла README среди них нет.
Спасибо сказали:
vovansystems
Сообщения: 25

Re: Настройка непустого удалённого git репозитория

Сообщение vovansystems »

watashiwa_daredeska писал(а):
10.01.2011 17:23
А зачем на сервере делать git pull? На сервере должен быть bare репозиторий, в который делается только git push с рабочих машин и git pull из него на рабочие машины.

Произошла путаница в терминологии. Под непустым репозиторием я подразумевал наличие рядом католога, изменения в котором он отслеживает. Зачем делать git pull - т.к. программисты просят сделать им возможность выкладывать обновления на продакшн сервер через git. Т.е. насколько я понял стандартная схема такая: 1. компьютер программиста 2. гит-репозиторий без каталога с файлами 3. продашн-сервер который по сути ничем не отличается от компьютера программиста-2, где делают git pull.

Я же пытаюсь решить задачу без отдельного гит-репозитория. Возможно ли чтобы на сервере к гит-репозиторию был прикреплён отслеживаемый каталог в определённом месте (например /var/www/site1), чтобы после пуша очередного изменения программиста он мог по ssh делать на сервере git pull и таким образом сразу изменять код работающего сайта?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Настройка непустого удалённого git репозитория

Сообщение watashiwa_daredeska »

vovansystems писал(а):
10.01.2011 18:03
Возможно ли чтобы на сервере к гит-репозиторию был прикреплён отслеживаемый каталог в определённом месте (например /var/www/site1), чтобы после пуша очередного изменения программиста он мог по ssh делать на сервере git pull и таким образом сразу изменять код работающего сайта?
А-а-а… Вот оно что. Тогда это делается при помощи hooks/post-update.
Если серверный репозиторий обычный (не bare), то нужно в нем сделать git config --add receive.denyCurrentBranch ignore, чтобы git не отказывался в него пушить, а в .git/hooks/post-update прописать git --git-dir=. --work-tree=.. reset --hard.

Соответствующим образом можно и для bare адаптировать, поправив путь к репозиторию (чтобы вел не к work-tree) и параметр --work-tree в hooks/post-update.

UPD: и никаких git pull на сервере. Всё делается тем же git push с клиента.
Спасибо сказали:
vovansystems
Сообщения: 25

Re: Настройка непустого удалённого git репозитория

Сообщение vovansystems »

О, спасибо! Помогло после того как добавил в .git/hooks/post-receive (чтобы игнорило все изменения внесённые в файлы на сервере не через гит):

Код: Выделить всё

#!/bin/bash
cd ..
env -u GIT_DIR git reset --hard master


Но теперь интересно было бы узнать как отменить изменения, внесённые допустим последним коммитом. После того как делаю локально git reset --hard HEAD^ а затем git push origin master получаю ответ, что камит не принят, т.к. это не фаст-форвард. Хотя на самом деле я сместил локально указатель на одну позицию назад и теперь пытаюсь сделать то же на сервере..

Код: Выделить всё

$ git push origin master
To git@domain.com:/home/secure/domains/domain.com
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@domain.com:/home/secure/domains/domain.com'
To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes (e.g. 'git pull') before pushing again.  See the 'Note about fast-forwards' section of 'git push --help' for details.


В мануале написано что remote rejected это вызвано because the remote repository has .. safety options in effect: receive.denyCurrentBranch (for pushes to the checked out branch). Тогда всётаки как правильно в данном случае отменить изменения внесённые посленим коммитом на сервер?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Настройка непустого удалённого git репозитория

Сообщение watashiwa_daredeska »

vovansystems писал(а):
10.01.2011 20:04
камит не принят, т.к. это не фаст-форвард. Хотя на самом деле я сместил локально указатель на одну позицию назад
Вот именно потому, что назад, это и не fast forward.
По хорошему, откат коммитов в общем репозитории путем удаления (перемещения HEAD назад) — плохая идея. git revert предпочтительнее.
Спасибо сказали:
vovansystems
Сообщения: 25

Re: Настройка непустого удалённого git репозитория

Сообщение vovansystems »

Всё - благодарю. Всё работает так как я хотел. А для того, чтобы программеры после реверта не теряли у себя изменения (если надо доделать) посоветовал правильно использовать ветки и после склеивания их сразу же не уничтожать.
Спасибо сказали:
Аватара пользователя
RedPlanet
Сообщения: 1

Re: Настройка непустого удалённого git репозитория

Сообщение RedPlanet »

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

Мои команды.

git branch local
git checkout local
git fetch origin some_remote_branch


Ровным счетом ничего не произошло. Я думал, что все изменения с some_remote_branch будут слиты в local, но посмотрел содержимое файлов: все осталось на своих местах, то есть как в master.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Настройка непустого удалённого git репозитория

Сообщение watashiwa_daredeska »

RedPlanet писал(а):
04.04.2012 12:40
Прочитал, что эта команда должна все таки сливать изменения с удаленной ветки в локальную
Если «сливать» = «скачивать», то да. На скачанные коммиты указывает метка FETCH_HEAD. Текущие branch и HEAD остаются без изменений.

RedPlanet писал(а):
04.04.2012 12:40
Я думал, что все изменения с some_remote_branch будут слиты в local, но посмотрел содержимое файлов: все осталось на своих местах, то есть как в master.
Возможно, Вам нужна команда git pull? Она аналогична такой паре команд: git fetch origin some_remote_branch && git merge FETCH_HEAD
Спасибо сказали:
Ответить