-
1. Úvod
- 1.1 Správa verzí
- 1.2 Stručná historie systému Git
- 1.3 Základy systému Git
- 1.4 Příkazový řádek
- 1.5 Instalace systému Git
- 1.6 První nastavení systému Git
- 1.7 Získání nápovědy
- 1.8 Shrnutí
-
2. Základy práce se systémem Git
-
3. Větve v systému Git
- 3.1 Větve v kostce
- 3.2 Základy větvení a slučování
- 3.3 Správa větví
- 3.4 Postupy při práci s větvemi
- 3.5 Vzdálené větve
- 3.6 Přeskládání
- 3.7 Shrnutí
-
4. Git na serveru
- 4.1 Protokoly
- 4.2 Zprovoznění Gitu na serveru
- 4.3 Generování veřejného klíče SSH
- 4.4 Nastavení serveru
- 4.5 Démon Git
- 4.6 Chytrý HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Možnosti hostování u třetí strany
- 4.10 Shrnutí
-
5. Distribuovaný Git
- 5.1 Distribuované pracovní postupy
- 5.2 Přispívání do projektu
- 5.3 Správa projektu
- 5.4 Shrnutí
-
6. GitHub
-
7. Git Tools
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Ladění v systému Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Shrnutí
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Atributy Git
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Shrnutí
-
9. Git a ostatní systémy
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Shrnutí
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Balíčkové soubory
- 10.5 The Refspec
- 10.6 Přenosové protokoly
- 10.7 Správa a obnova dat
- 10.8 Environment Variables
- 10.9 Shrnutí
-
A1. Appendix A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in Powershell
- A1.7 Shrnutí
-
A2. Appendix B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
-
A3. Appendix C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
10.5 Git Internals - The Refspec
The Refspec
Throughout this book, we’ve used simple mappings from remote branches to local references, but they can be more complex. Řekněme, že přidáte například tento vzdálený repozitář:
$ git remote add origin https://github.com/schacon/simplegit-progit
Přidáte tím novou část do souboru .git/config
, určíte název vzdáleného serveru (origin
), URL vzdáleného repozitáře a refspec pro vyzvednutí dat:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
Refspec má následující formát: fakultativní znak +
, za nímž následuje <src>:<dst>
, kde <src>
je vzor pro referenci na straně vzdáleného serveru a <dst>
je lokální umístění, kam mají být tyto reference zapsány.
The +
tells Git to update the reference even if it isn’t a fast-forward.
Ve výchozím případě, který se automaticky zapisuje příkazem git remote add
, Git vyzvedne všechny reference z adresáře refs/heads/
na serveru a zapíše je do lokálního adresáře refs/remotes/origin/
.
Je-li tedy na serveru hlavní větev master
, lokálně lze získat přístup k jejímu logu některým z příkazů:
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
They’re all equivalent, because Git expands each of them to refs/remotes/origin/master
.
Pokud ale raději chcete, aby Git pokaždé stáhl pouze větev master
a nestahoval žádné jiné větve na vzdáleném serveru, změňte řádek příkazu fetch na:
fetch = +refs/heads/master:refs/remotes/origin/master
Toto je výchozí vzorec refspec pro příkaz git fetch
pro tento vzdálený server.
Chcete-li nějakou akci provést pouze jednou, můžete použít refspec také na příkazovém řádku.
Chcete-li stáhnout větev master
ze vzdáleného serveru do lokálního adresáře origin/mymaster
, můžete zadat příkaz:
$ git fetch origin master:refs/remotes/origin/mymaster
Použít lze také kombinaci několika vzorců refspec. Několik větví můžete přímo z příkazového řádku stáhnout například takto:
$ git fetch origin master:refs/remotes/origin/mymaster \
topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
! [rejected] master -> origin/mymaster (non fast forward)
* [new branch] topic -> origin/topic
In this case, the master
branch pull was rejected because it wasn’t a fast-forward reference.
Odmítnutí serveru můžete potlačit zadáním znaku +
před vzorec refspec.
V konfiguračním souboru můžete také použít více vzorců refspec pro vyzvedávání dat.
If you want to always fetch the master
and experiment
branches, add two lines:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
You can’t use partial globs in the pattern, so this would be invalid:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
However, you can use namespaces (or directories) to accomplish something like that.
If you have a QA team that pushes a series of branches, and you want to get the master
branch and any of the QA team’s branches but nothing else, you can use a config section like this:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
Jestliže používáte komplexní pracovní proces, kdy QA tým odesílá větve, vývojáři odesílají větve a integrační týmy odesílají větve a spolupracují na nich, můžete takto jednoduše využít možností, jež vám jmenný prostor nabízí.
Pushing Refspecs
It’s nice that you can fetch namespaced references that way, but how does the QA team get their branches into a qa/
namespace in the first place?
Tady vám při odesílání větví pomůže vzorec refspec.
Chce-li QA tým odeslat větev master
do adresáře qa/master
na vzdáleném serveru, může použít příkaz:
$ git push origin master:refs/heads/qa/master
Chcete-li, aby toto Git provedl automaticky pokaždé, když spustíte příkaz git push origin
, můžete do konfiguračního souboru vložit hodnotu push
:
[remote "origin"]
url = https://github.com/schacon/simplegit-progit
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
Touto hodnotou zajistíte, že bude příkaz git push origin
odesílat lokální větev master
do vzdálené větve qa/master
.
Mazání referencí
Vzorce refspec můžete využít také k mazání referencí ze vzdáleného serveru. Spustit lze například příkaz následujícího znění:
$ git push origin :topic
Because the refspec is <src>:<dst>
, by leaving off the <src>
part, this basically says to make the topic
branch on the remote nothing, which deletes it.