-
1. Başlanğıc
- 1.1 Versiyaya Nəzarət Haqqında
- 1.2 Git’in Qısa Hekayəsi
- 1.3 Git Nədir?
- 1.4 Əmr Sətiri
- 1.5 Git’i Quraşdırmaq
- 1.6 İlk Dəfə Git Quraşdırması
- 1.7 Kömək Almaq
- 1.8 Qısa Məzmun
-
2. Git’in Əsasları
-
3. Git’də Branch
- 3.1 Nutshell’də Branch’lar
- 3.2 Sadə Branching və Birləşdirmə
- 3.3 Branch İdarəedilməsi
- 3.4 Branching İş Axınları
- 3.5 Uzaq Branch’lar
- 3.6 Rebasing
- 3.7 Qısa Məzmun
-
4. Server’də Git
- 4.1 Protokollar
- 4.2 Serverdə Git Əldə Etmək
- 4.3 Sizin öz SSH Public Key’nizi yaratmaq
- 4.4 Server qurmaq
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Üçüncü Tərəf Seçimləri
- 4.10 Qısa Məzmun
-
5. Paylanmış Git
-
6. GitHub
-
7. Git Alətləri
- 7.1 Reviziya Seçimi
- 7.2 Interaktiv Səhnələşdirmə
- 7.3 Stashing və Təmizləmə
- 7.4 İşinizin İmzalanması
- 7.5 Axtarış
- 7.6 Tarixi Yenidən Yazmaq
- 7.7 Reset Demystified
- 7.8 İnkişaf etmiş Birləşmə
- 7.9 Rerere
- 7.10 Git ilə Debugging
- 7.11 Alt Modullar
- 7.12 Bundling
- 7.13 Dəyişdirmək
- 7.14 Etibarlı Yaddaş
- 7.15 Qısa Məzmun
-
8. Git’i Fərdiləşdirmək
- 8.1 Git Konfiqurasiyası
- 8.2 Git Atributları
- 8.3 Git Hook’ları
- 8.4 Git-Enforced Siyasət Nümunəsi
- 8.5 Qısa Məzmun
-
9. Git və Digər Sistemlər
- 9.1 Git Müştəri kimi
- 9.2 Git’ə Miqrasiya
- 9.3 Qısa Məzmun
-
10. Git’in Daxili İşləri
- 10.1 Plumbing və Porcelain
- 10.2 Git Obyektləri
- 10.3 Git Referansları
- 10.4 Packfile’lar
- 10.5 Refspec
- 10.6 Transfer Protokolları
- 10.7 Maintenance və Məlumatların Bərpası
- 10.8 Mühit Dəyişənləri
- 10.9 Qısa Məzmun
-
A1. Appendix A: Digər Mühitlərdə Git
- A1.1 Qrafik interfeyslər
- A1.2 Visual Studio’da Git
- A1.3 Visual Studio Code’da Git
- A1.4 Eclipse’də Git
- A1.5 Sublime Text’də Git
- A1.6 Bash’da Git
- A1.7 Zsh’də Git
- A1.8 PowerShell’də Git
- A1.9 Qısa Məzmun
-
A2. Appendix B: Proqramlara Git Daxil Etmək
- A2.1 Əmr-sətri Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Git Əmrləri
- A3.1 Quraşdırma və Konfiqurasiya
- A3.2 Layihələrin Alınması və Yaradılması
- A3.3 Sadə Snapshotting
- A3.4 Branching və Birləşmə
- A3.5 Layihələrin Paylaşılması və Yenilənməsi
- A3.6 Yoxlama və Müqayisə
- A3.7 Debugging
- A3.8 Patching
- A3.9 E-poçt
- A3.10 Xarici Sistemlər
- A3.11 İdarəetmə
- A3.12 Plumbing Əmrləri
7.14 Git Alətləri - Etibarlı Yaddaş
Etibarlı Yaddaş
Uzaqdan əlaqə qurmaq üçün SSH transport-dan istifadə etsəniz, istifadəçi adınızı və şifrənizi yazmadan məlumatları etibarlı şəkildə ötürməyinizə imkan verən keçidsiz bir key-in olması mümkündür. Bununla birlikdə, HTTP protokolları ilə bu mümkün deyil - hər əlaqə üçün istifadəçi adı və şifrə lazımdır. Parol üçün istifadə etdiyiniz işarələrin təsadüfi yaradılmış və açıqlanmayan olması iki faktor identifikasiyası olan sistemlər üçün daha da çətinləşir.
Xoşbəxtlikdən, Git bu işdə kömək edə biləcək creditantals sisteminə sahibdir. Git qutusunda bir neçə seçim vardır:
-
Standart olan heç bir şey cache deyil. Hər bir əlaqə istifadəçi adınızı və şifrənizi tələb edəcəkdir.
-
“cache” rejimi creditental-ları müəyyən müddət yaddaşlarda saxlayır. Parolların heç biri diskdə saxlanılmır və 15 dəqiqədən sonra yaddaşdan silinir.
-
“store” rejimi creditental-ları diskdəki düz mətnli bir faylda saxlayır və heç vaxt bitmir. Bu o deməkdir ki, Git host üçün parolunuzu dəyişməyincə, yenidən creditental-nızı təkrar yazmağa məcbur olmayacaqsınız. Bu yanaşmanın mənfi tərəfi odur ki, parollarınız mətndə ev qovluğunuzdakı düz bir sənəddə saxlanılır.
-
Əgər Mac istifadə edirsinizsə, Git sistem hesabınıza daxil edilmiş etibarlı key zəncirində creditental məlumatlarını saxlayan bir “osxkeychain” rejimi ilə gəlir. Bu üsul creditental-larını diskdə saxlayır və heç vaxt bitmir, lakin onlar HTTPS sertifikatları və Safari auto-fill-ləri saxlayan eyni sistemlə şifrələnirlər.
-
Windows istifadə edirsinizsə, “Git Credential Manager for Windows” adlı bir köməkçi quraşdıra bilərsiniz. Onu https://github.com/Microsoft/Git-Credential-Manager-for-Windows-da tapa bilərsiniz.
Git konfiqurasiya dəyərini təyin edərək bu üsullardan birini seçə bilərsiniz:
$ git config --global credential.helper cache
Bu köməkçilərin bəzilərinin də seçimləri var.
“store” köməkçisi, plain-text faylının harada saxlandığını təyin edən (standart olan ~/.git-credentials
) --file <path>
arqumenti götürə bilər.
“cache” köməkçisi, demonunun işlədilmə müddətini dəyişdirən --timeout <seconds>
seçimi qəbul edir (standart olaraq “900” və ya 15 dəqiqə).
“store” köməkçisini xüsusi bir fayl adı ilə necə düzəldəcəyinizə dair bir nümunə:
$ git config --global credential.helper 'store --file ~/.my-credentials'
Git hətta sizə bir neçə köməkçini konfiqurasiya etməyə imkan verir.
Müəyyən bir host üçün creditental-ı axtararkən Git bunları qaydasında soruşacaq və ilk cavab verildikdən sonra dayanacaq.
Creditental-nı saxlayarkən Git, siyahıdakı köməkçilərin hamısına istifadəçi adı və şifrənizi göndərəcək və sizin onlarla nə edəcəyinizi seçə bilərlər.
Budur .gitconfig
, thumb drive-da creditental sənədləri faylı olsaydı, ancaq drive qoşulmadığı təqdirdə bəzi yazmaları saxlamaq üçün yaddaş cache-dan istifadə etmək istərdi:
[credential]
helper = store --file /mnt/thumbdrive/.git-credentials
helper = cache --timeout 30000
Hood Altında
Bəs bütün bunlar necə işləyir?
Git’in creditental-köməkçi sistemi üçün kök əmri, arqument olaraq bir əmr götürən və sonra stdin vasitəsilə daha çox giriş olan git creditental
-dır.
Bir nümunə ilə başa düşmək daha asan ola bilər.
Tutaq ki, creditental köməkçisi quruldu və köməkçi mygithost
üçün creditental-ı saxladı.
Budur, Git bir host üçün creditentals-ı tapmaq istəyərkən səslənən “fill” əmrini istifadə edən bir sessiya:
$ git credential fill (1)
protocol=https (2)
host=mygithost
(3)
protocol=https (4)
host=mygithost
username=bob
password=s3cre7
$ git credential fill (5)
protocol=https
host=unknownhost
Username for 'https://unknownhost': bob
Password for 'https://bob@unknownhost':
protocol=https
host=unknownhost
username=bob
password=s3cre7
-
Bu qarşılıqlı fəaliyyətə başlayan əmr sətridir.
-
Git-creditental sonra stdin-də giriş gözləyir. Biz onu bildiyimiz şeylərlə təmin edirik: protokol və host adı.
-
Boş bir xətt girişin tamamlandığını göstərir və creditental sistemi bildikləri ilə cavab verməlidir.
-
Git-creditental sonra hər şeyi toplayır və tapdığı məlumatlarla stdout yazır.
-
Creditental-lar tapılmadıqda, Git istifadəçi adını və şifrəsini soruşur və onları yenidən çağıran stdouta təqdim edir (burada eyni console-lara əlavə olunur).
Creditental sistemi, həqiqətən Git-dən ayrı bir proqramı işə salır; hansı və necə olmalı olduğu creditental.helper konfiqurasiya dəyərindən asılıdır. Onun qəbul edə biləcəyi bir neçə forma var:
Configuration Value | Behavior |
---|---|
|
Runs |
|
Runs |
|
Runs |
|
Code after |
Beləliklə, yuxarıda təsvir olunan köməkçilər əslində git-credential-cache
, git-credential-store
və sair adlandırılmışdır və onları əmr sətri arqumentlərini götürmək üçün konfiqurasiya edə bilərik. Bunun üçün ümumi forma “git-credential-foo [args] <action>.”
Stdin/stdout protokolu git-creditental ilə eynidır, lakin onlar bir az fərqli tədbirlər toplusundan istifadə edirlər:
-
get
bir istifadəçi adı/parol cütü üçün bir tələbdir. -
store
, bu köməkçinin yaddaşında bir sıra creditentals saxlamaq istəyidir. -
erase
verilmiş xüsusiyyətlərin creditentals-nı bu köməkçinin yaddaşından təmizləmək üçündür.
store
və erase
hərəkətləri üçün heç bir cavab tələb olunmur (Git buna onsuz da məhəl qoymur).
Lakin, get
hərəkəti üçün Git köməkçinin söylədiyi fikirlərlə çox maraqlanır.
Köməkçi faydalı bir şey bilmirsə, heç bir output olmadan çıxa bilər, ancaq bilirsə, verdiyi məlumatı store-dakı məlumatlarla artırmalıdır.
Output bir sıra tapşırıq bəyanatları kimi qəbul edilir; təqdim olunan hər şey Git-in artıq bildiyini əvəz edəcəkdir.git-creditentals
Budur yuxarıdakı misal kimi, ancaq -ı atlayaraq və git-credential-store-a üçün birbaşa getmək:
$ git credential-store --file ~/git.store store (1)
protocol=https
host=mygithost
username=bob
password=s3cre7
$ git credential-store --file ~/git.store get (2)
protocol=https
host=mygithost
username=bob (3)
password=s3cre7
-
Burada bəzi creditentals-ı saxlamaq üçün
git-credential-store
-a deyirik: istifadəçi adı “bob” və parol “s3cre7”https://mygithost
-a daxil olduqda istifadə edilməlidir. -
ndi bu creditentals-ı geri alacağıq. Artıq tanıdığımız əlaqə hissələrini (
https://mygithost
) və boş bir xətt provide edirik. -
git-credential-store
yuxarıda saxladığımız istifadəçi adı və şifrə ilə cavablayır.
Budur ~/git.store
faylının görünüşü:
https://bob:s3cre7@mygithost
Bunların hər biri özündə creditental ilə bəzədilmiş bir URL olan bir sıra xətlərdir.
Bu osxkeychain
və wincred
köməkçiləri öz backing store-larının yerli formatını istifadə edirlər, cache isə öz yaddaş formatını (başqa heç bir proses oxuya bilməz) istifadə edir.
Xüsusi Creditental Cache
git-creditental-store
və dostların Git-dən ayrı bir proqram olduğunu nəzərə alsaq, hər hansı bir proqramın Git creditental-ın köməkçisi ola biləcəyini başa düşmək çox çətin deyil.
Git tərəfindən təmin olunan köməkçilər bir çox ümumi istifadə hallarını əhatə edir, lakin hamısını deyil.
Məsələn, deyək ki, komandanızın, bəlkə də yerləşdirilmə üçün bütün komanda ilə paylaşılan bəzi creditentals-ı var.
Bunlar ortaq bir qovluqda saxlanılır, ancaq tez-tez dəyişdikləri üçün onları öz creditental store-a kopyalamaq istəmirsiniz. Mövcud köməkçilərdən heç biri bu işi əhatə etmir; buna görə də özünüzə yazmaq üçün nə lazım olduğuna baxaq.
Bu proqramın ehtiyac duyduğu bir neçə əsas xüsusiyyət var:
-
Diqqət etməli olduğumuz yeganə hərəkət
get
-dir;store
vəerase
yazma əməliyyatlarıdır, buna görə də, o qəbul olunduqda yalnız təmiz şəkildə çıxacağıq. -
Paylaşılan creditentals sənədinin fayl formatı
git-credential-store
-da istifadə edilənə bənzərdir. -
Həmin faylın yeri kifayət qədər standartdır, lakin istifadəçinin yalnız bir halda custom path-i keçməsinə icazə verməliyik.
Bu genişlənməni bird aha Ruby-də yazacağıq, ancaq Git hazır məhsulu işləyə bilənə qədər istənilən dil işləyəcəkdir. Budur yeni creditentals köməkçimizin tam mənbə kodu:
#!/usr/bin/env ruby
require 'optparse'
path = File.expand_path '~/.git-credentials' # (1)
OptionParser.new do |opts|
opts.banner = 'USAGE: git-credential-read-only [options] <action>'
opts.on('-f', '--file PATH', 'Specify path for backing store') do |argpath|
path = File.expand_path argpath
end
end.parse!
exit(0) unless ARGV[0].downcase == 'get' # (2)
exit(0) unless File.exists? path
known = {} # (3)
while line = STDIN.gets
break if line.strip == ''
k,v = line.strip.split '=', 2
known[k] = v
end
File.readlines(path).each do |fileline| # (4)
prot,user,pass,host = fileline.scan(/^(.*?):\/\/(.*?):(.*?)@(.*)$/).first
if prot == known['protocol'] and host == known['host'] and user == known['username'] then
puts "protocol=#{prot}"
puts "host=#{host}"
puts "username=#{user}"
puts "password=#{pass}"
exit(0)
end
end
-
Burada command-line seçimlərini təhlil edirik, istifadəçiyə giriş faylı göstərməyə imkan verir. Standart bir
~/.git-credentials
-dır. -
. Bu proqram yalnız hərəkət
get
olduqda və backing store faylı mövcud olduqda cavab verir. -
Bu loop stdin-dən ilk boş sətrə çatana qədər oxunur. Girişlər sonrakı istinad üçün known hash-də saxlanılır.
-
Bu loop, storage faylının məzmununu oxuyur, uyğunluq axtarır.
Known
-dan olan protokol və host bu xətlə uyğunlaşırsa, proqram nəticələri stdout-a yazır və çıxış edir.
Köməkçimizi git-credential-read-only
olaraq saxlayacağıq, onu PATH-a bir yerə qoyub icra edilə bilən kimi işarələyəcəyik.
İnteraktiv seans isə bu tip görünür:
$ git credential-read-only --file=/mnt/shared/creds get
protocol=https
host=mygithost
protocol=https
host=mygithost
username=bob
password=s3cre7
Adı “git-” ilə başladığından, konfiqurasiya dəyəri üçün sadə sintaksisdən istifadə edə bilərik:
$ git config --global credential.helper 'read-only --file /mnt/shared/creds'
Gördüyünüz kimi, bu sistemin uzanması olduqca sadədir və eyni zamanda sizin və komandanız üçün bəzi ümumi problemləri həll edə bilər.