Git: Porovnání verzí
Řádek 75: | Řádek 75: | ||
==== Příklad ==== | ==== Příklad ==== | ||
Přidání souboru. | |||
git pull | |||
git add Makefile | |||
git status | |||
<pre> | |||
# On branch master | |||
# Changes to be committed: | |||
# (use "git reset HEAD <file>..." to unstage) | |||
# | |||
# new file: Makefile | |||
# | |||
</pre> | |||
git commit -am "soubor Makefile" | |||
git push | |||
Modifikace souboru. | |||
git pull | |||
emacs Makefile | |||
git status | |||
<pre> | |||
# On branch master | |||
# Changed but not updated: | |||
# (use "git add <file>..." to update what will be committed) | |||
# (use "git checkout -- <file>..." to discard changes in working directory) | |||
# | |||
# modified: Makefile | |||
# | |||
no changes added to commit (use "git add" and/or "git commit -a") | |||
</pre> | |||
git diff | |||
<pre> | |||
diff --git a/Makefile b/Makefile | |||
index 5fe6f05..af4dff4 100644 | |||
--- a/Makefile | |||
+++ b/Makefile | |||
@@ -5,3 +5,10 @@ default: pdf | |||
pdf: | |||
$(PDFLATEX) $(FILE).tex | |||
+ | |||
+clean: | |||
+ rm -f *.aux *.toc *.log | |||
+ | |||
+distclean: | |||
+ make clean | |||
+ rm -f $(FILE).pdf | |||
</pre> | |||
git commit -am "Makefile: clean & distclean" | |||
git push | |||
Odstranění souboru. | |||
git rm Makefile | |||
git status | |||
<pre> | |||
# On branch master | |||
# Changes to be committed: | |||
# (use "git reset HEAD <file>..." to unstage) | |||
# | |||
# deleted: Makefile | |||
# | |||
</pre> | |||
git commit -am "Makefile odstranen" | |||
git push | |||
== Ignorované soubory == | == Ignorované soubory == |
Verze z 11. 4. 2010, 15:20
When I say I hate CVS with a passion, I have to also say that if there any SVN users (Subversion users) in the audience, you might want to leave. Because my hatred of CVS has meant that I see Subversion as being the most pointless project ever started, because the whole slogan for the Subversion for a while was 'CVS done right' or something like that.
--- Linus Torvalds
Git je distribuovaný systém pro správu verzí (software pro správu zdrojových kódů projektů). Git byl původně vytvořen Linusem Torvaldsem pro vývoj jádra Linux, dnes je spravován Junion Hamanem. Git je svobodný softare šířený pod GPL licencí verze 2.
Instalace
apt-get install git-core
Další doplňující balíčky jsou git-cvs, git-svn, git-daemon-run, git-gui, gitk a gitweb.
Vytvoření repozitáře
Nový prázdný git repozitář vytvoří příkaz
git-init-db
Git repozitář můžeme vytvořit pro existující projekt, například
cd /cesta/k/mému/projektu git-init-db (1) git-add . (2)
kde (1) vytvoří /cesta/k/mému/projektu/.git adresář a (2) přidá do projektu všechny existující soubory z běžného adresáře (symbol tečka).
Git může být takto používán i pro lokální projekty na kterých pracuje jediný uživatel.
Naklonování repozitáře
Repozitář, který máme přístupný přes ssh naklonujem příkazem git clone, například
git clone git@josef.fsv.cvut.cz:sandbox.git
Pracovní cyklus
Před samotnou prací s Gitem je vhodné nastavit minimální metadata, např.
git config user.name "Martin Landa" git config user.email "martin.landa@fsv.cvut.cz"
Před modifikací dat v repozitáři je vždy vhodné aktualizovat jeho lokální kopii.
git pull
Před nahráním změn do repozitáře může být užitečné vypsat seznam těchto změn
git status
anebo jejich přehled.
git diff
- Přidání souboru/adresáře
Přidání adresáře (rekurzivně) či souboru.
git add <soubor>
- Odebrání souboru/adresáře
git rm <soubor>
- Přejmenování souboru/adresáře
git mv <soubor> <soubor1>
- Nahrání změn do repozitáře
Nahrání změn do lokálního repozitáře.
git commit -am "logovaci zprava"
Nahrání změn do vzdáleného repozitáře.
git push
Příklad
Přidání souboru.
git pull git add Makefile
git status
# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: Makefile #
git commit -am "soubor Makefile" git push
Modifikace souboru.
git pull emacs Makefile git status
# On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: Makefile # no changes added to commit (use "git add" and/or "git commit -a")
git diff
diff --git a/Makefile b/Makefile index 5fe6f05..af4dff4 100644 --- a/Makefile +++ b/Makefile @@ -5,3 +5,10 @@ default: pdf pdf: $(PDFLATEX) $(FILE).tex + +clean: + rm -f *.aux *.toc *.log + +distclean: + make clean + rm -f $(FILE).pdf
git commit -am "Makefile: clean & distclean" git push
Odstranění souboru.
git rm Makefile git status
# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: Makefile #
git commit -am "Makefile odstranen" git push
Ignorované soubory
Soubory, které si přejete, aby Git ignoroval např. při git status uvádějte v souboru '.gitignore'. Např.
cat .gitignore *.aux *.log *.toc
git add .gitignore git commit -am "seznam ignorovanych souboru" git push
Správa větví
Jeden git repozitář může udržovat více vývojových větví (branches). Pro vytvoření větve se jménem "experimentalni" zadáme příkaz
$ git branch experimentalni
Jestliže následně zadáme příkaz
$ git branch
získáme výpis všech existujících větví.
experimentalni * master
Kde "experimentalni" je jméno právě vytvořené větve a "master" je implicitní automaticky vytvořená větev. Hvězdička označuje větev, ve které se právě nacházíme. Pro přechod k jiné větvi zadáme
$ git checkout experimentalni
Pro sloučení experimentalni větve s master zadáme
$ git commit -a # v experientalni vetvi $ git checkout master $ git pull . experimentalni
Obnova nechtěně zrušených souborů
Zrušené soubory zobrazíme příkazem
$ git ls-files -d
pro jejich obnovení stačí zadat
$ git ls-files -d | xargs git checkout --
Převod CVS repozitáře na git
Přihlásíme se pomocí ssh na server s CVS repozitářem a pomocí příkazu git import vytvoříme git kopii. Tato operace může chvíli trvat, protože jsou převáděny všechny verze souborů uložené na CVS.
ssh gin@josef.fsv.cvut.cz git cvsimport -v -d /home2/gin/cvsroot -C git gin
Na svém počítači vytvoříme klon nového git repozitáře.
git clone gin@josef.fsv.cvut.cz:/home2/gin/git
V adresáři git (jméno adresáře použité v naší ukázce) změníme jeden soubor, zobrazíme diff a uložíme změny v lokální kopii.
cd git edit README git diff git commit -a
Pro uložení změn v hlavním repozitáři musíme použít příkaz git push
.
Příklad
git cvsimport -v -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/sqltutor \ -C sqltutor sqltutor
Převod SVN repozitáře na git
Převod SVN repozitáře na Git se provede pomocí příkazu git svnimport (součást balíčku 'git-svn'). Příklad:
git svnimport -r -v -C landa-ds-git -I .gitignore -T "" -A authors file:///home2/vs/svn/landa-ds git clone --bare landa-ds-git landa-ds rm -rf landa-ds-git
Poznámka pro SVN repozitáře bez trunku.
Příklad souboru authors.
cat authors landa = Martin Landa <martin.landa@fsv.cvut.cz>
Gitosis
Gitosis je nástroj pro správu Git repozitářů.
Instalace
apt-get install python-setuptools git clone git://eagain.net/gitosis.git python setup.py install
nebo pro Debian GNU/Linux
apt-get install gitosis
Zprovoznění
Založíme uživatele git.
adduser \ --system \ --shell /bin/sh \ --gecos 'git version control' \ --group \ --disabled-password \ --home /home/git \ git
Vytvoříme repozitář pro Gitosis a nahraje veřejné klíče.
cd /home/git cd repositories gitosis-init < /tmp/id_dsa.pub chmod 775 gitosis-admin.git/hooks/post-update
Na lokální počítač stáhneme repozirář gitosis-admin.
git clone git@josef.fsv.cvut.cz:gitosis-admin.git
Přidání uživatele do skupiny
Příklad přidání uživatele 'cepek' do skupiny 'gitosis-admin'.
cd gitosis-admin cat gitosis.conf [group gitosis-admin] writable = gitosis-admin members = landa cepek
cp ~/smetiste/id_dsa.pub keydir/cepek.pub git add keydir/cepek.pub git commit -a -m"+cepek (gitosis-admin)" git push
Gitweb
Gitweb je CGI skript umožňující přístup ke Git repozitářům z prostředí webového prohlížeče. Příklad na serveru 'josef':
Postup při zprovoznění.
apt-get install gitweb mkdir /var/www/git cat /etc/apache2/sites-enabled/005-git
<Directory /var/www/git> Allow from all AllowOverride all Order allow,deny Options ExecCGI <Files gitweb.cgi> SetHandler cgi-script </Files> </Directory> DirectoryIndex gitweb.cgi SetEnv GITWEB_CONFIG /etc/gitweb.conf
cp /usr/share/gitweb/* /var/www/git cp /usr/lib/cgi-bin/gitweb.cgi /var/www/git cat /etc/gitweb.conf
# path to git projects (<project>.git) $projectroot = "/home/git/repositories"; # directory to use for temp files $git_temp = "/tmp"; # target of the home link on top of all pages #$home_link = $my_uri || "/"; # html text to include at home page $home_text = "indextext.html"; # file with project list; by default, simply scan the projectroot dir. $projects_list = $projectroot; # stylesheet to use $stylesheet = "/git/gitweb.css"; # logo to use $logo = "/git/git-logo.png"; # the 'favicon' $favicon = "/git/git-favicon.png";
/etc/init.d/apache2 reload