git clone: jinsi ya kunakili hifadhi kutoka GitHub na kwingineko
git clone hupakua hifadhi nzima ya mbali — faili zote, historia yote ya commits na matawi — na kuunda nakala ya ndani yenye remote origin iliyosanidiwa. Amri ya msingi ni git clone anwani-ya-hifadhi. Bendera hukuruhusu kuchagua folda, tawi, au kupakua commits chache za mwisho kwa --depth 1.
Amri git clone inaunda nakala kamili ya ndani ya hifadhi ya mbali: faili, historia yote ya commits, matawi na tagi. Hii ndiyo njia ya kawaida ya kuanza kazi kwenye mradi ambao tayari upo GitHub, GitLab au seva ya kampuni. Tofauti na kupakua faili la ZIP, clone ni hifadhi kamili inayoweza kufanya commit na kutuma mabadiliko kurudi.
Matumizi ya msingi ya git clone
Nakili anwani ya hifadhi (kwenye GitHub — kitufe cha kijani «Code») kisha tekeleza:
git clone https://github.com/username/project.git
Cloning into 'project'...
remote: Enumerating objects: 1532, done.
remote: Counting objects: 100% (1532/1532), done.
remote: Compressing objects: 100% (812/812), done.
Receiving objects: 100% (1532/1532), 2.41 MiB | 6.10 MiB/s, done.
Resolving deltas: 100% (701/701), done.
Git itaunda folda project kwenye saraka ya sasa (jina linachukuliwa kutoka anwani bila .git). Kisha ingia ndani yake:
cd project
git status
Git clone inafanya nini chini ya kofia
Kunakili si kupakua faili tu. Kuelewa hatua hizi kunaeleza kwa nini baada ya clone kila kitu «kinafanya kazi tu» na kwa nini matawi yenye kiambishi origin/ yanaonekana. Hatua kwa hatua amri inafanya yafuatayo:
- inaunda folda na kutekeleza ndani yake kitu sawa na
git init; - inaongeza remote yenye jina
origin, inayoelekeza kwenye anwani ya asili; - inapakua vitu vyote na marejeo — sawa na
git fetch; - inaunda matawi ya mbali
origin/main,origin/developna kadhalika; - inaunda tawi la ndani la chaguo-msingi (kwa kawaida
main), kulifungamanisha naorigin/mainna kuweka faili kwenye saraka ya kazi.
Ndiyo maana baada ya clone huhitaji kusanidi git remote kwa mkono — git push na git pull zinafanya kazi mara moja.
git remote -v
origin https://github.com/username/project.git (fetch)
origin https://github.com/username/project.git (push)
Kunakili kupitia HTTPS na SSH
| HTTPS | SSH | |
|---|---|---|
| Anwani | https://github.com/user/repo.git | git@github.com:user/repo.git |
| Hifadhi ya umma | Inanakiliwa bila kuingia | Inahitaji ufunguo wa SSH uliowekwa kwenye akaunti |
| Hifadhi ya faragha, push | Inahitaji Personal Access Token badala ya nenosiri | Inafanya kazi kwa ufunguo, bila kuandika nenosiri |
| Mitandao ya kampuni | Bandari 443 karibu kila mara iko wazi | Bandari 22 wakati mwingine imefungwa |
Kusoma miradi ya umma ya watu wengine HTTPS inatosha. Kwa hifadhi zako mwenyewe ambazo unatuma mara kwa mara, SSH ni rahisi zaidi:
git clone git@github.com:username/project.git
Ikiwa tayari umenakili kupitia HTTPS na unataka kubadili kwenda SSH, si lazima kupakua tena:
git remote set-url origin git@github.com:username/project.git
Jinsi ya kunakili kwenye folda maalum
Hoja ya pili ni jina au njia ya folda lengwa:
# Kwenye folda yenye jina tofauti
git clone https://github.com/username/project.git my-copy
# Kwenye folda ya sasa (lazima iwe tupu)
git clone https://github.com/username/project.git .
Ikiwa folda lengwa ipo na si tupu, Git itakataa: fatal: destination path 'project' already exists and is not an empty directory.
Jinsi ya kunakili tawi fulani
Kwa chaguo-msingi, baada ya clone uko kwenye tawi la chaguo-msingi la hifadhi ya mbali. Ili uwe kwenye tawi jingine mara moja, tumia -b (--branch):
git clone -b develop https://github.com/username/project.git
Angalia: hapa matawi yote yanapakuliwa, wewe tu unakuwa kwenye develop. Ikiwa unataka tawi moja tu bila mengine, ongeza --single-branch:
git clone -b develop --single-branch https://github.com/username/project.git
Bendera -b pia inakubali jina la tagi — basi utapata hali ya mradi wakati wa kutolewa (katika hali ya detached HEAD):
git clone -b v2.1.0 --depth 1 https://github.com/username/project.git
Matawi mengine yako wapi baada ya clone
Wanaoanza mara nyingi wanashangaa: git branch inaonyesha main pekee. Matawi mengine yamepakuliwa kama ya mbali, na unaweza kuyaona hivi:
git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/feature/login
Ili kuanza kazi kwenye mojawapo, badili kwa jina fupi — Git yenyewe itaunda tawi la ndani linalofuatilia la mbali:
git switch develop
Clone fupi: --depth kwa hifadhi kubwa
Miradi ya zamani inaweza kuwa na historia ya gigabaiti. Ikiwa unahitaji msimbo wa sasa tu — kwa mfano kwenye CI au kujenga mradi tu — pakua commits chache za mwisho:
git clone --depth 1 https://github.com/username/big-project.git
Bendera --depth inamaanisha --single-branch, kwa hiyo utapokea tu tawi la chaguo-msingi na commit moja. Ikiwa baadaye utahitaji historia kamili, unaweza kuipakua:
git fetch --unshallow
Unaweza pia kutaja kina kingine, kwa mfano --depth 50, au kupunguza historia kwa tarehe kwa --shallow-since=2025-01-01. Kwa maendeleo hai, clone fupi si rahisi: git log, git blame na utafutaji kwenye historia vitakuwa havijakamilika.
Clone ya sehemu: --filter
Mbadala kwa monorepo kubwa sana ni kupakua historia ya commits, lakini maudhui ya faili yakipakuliwa kwa kuhitajika:
git clone --filter=blob:none https://github.com/username/monorepo.git
Kwa njia hii unahifadhi historia kamili kwa log na kubadili matawi, lakini unaokoa mtandao na nafasi. Inahitaji usaidizi kutoka seva; GitHub na GitLab wanaunga mkono.
Nakala ya kioo (mirror) na kuhamisha hifadhi
Clone ya kawaida huchukua matawi kama ya mbali na haonakili viungo vya ndani vya seva. Kwa kuhamisha mradi kwenda huduma nyingine au kuunda nakala ya akiba «kama ilivyo», tumia --mirror:
git clone --mirror https://github.com/username/project.git
cd project.git
git push --mirror git@gitlab.com:username/project.git
Kioo ni hifadhi tupu (bare) bila faili za kazi, ambamo matawi na tagi zote zimehifadhiwa kama za ndani. Amri git push --mirror itavituma vyote kwenye seva mpya, na historia itahamia bila kupotea. Kumbuka kwamba kazi (tasks), pull requests na mipangilio ya huduma haihamishwi kwa njia hii — hiyo ni data ya huduma, si ya Git.
Bendera --bare pia inaunda hifadhi bila saraka ya kazi, lakini inanakili matawi na tagi tu. Inafaa kuweka hifadhi kuu kwenye seva yako mwenyewe kutoka mradi uliopo.
Kunakili pamoja na submodules
Ikiwa mradi unatumia git submodules, kwa chaguo-msingi folda zao zitabaki tupu. Ili kupakua kila kitu mara moja:
git clone --recurse-submodules https://github.com/username/project.git
Ikiwa tayari umenakili bila bendera hii — pakua submodules baadaye:
git submodule update --init --recursive
git clone, fork na kupakua ZIP
| Njia | Unachopata | Lini kutumia |
|---|---|---|
git clone | Hifadhi kamili yenye historia na remote | Kazi kwenye mradi ambapo una ruhusa au unahitaji historia |
| Fork kwenye GitHub | Nakala ya hifadhi kwenye akaunti yako kwenye seva | Kuchangia mradi wa mtu mwingine kwa pull request |
| Download ZIP | Faili tu, bila .git | Kutazama msimbo haraka, bila mpango wa kufanya commit |
Fork na clone hazishindani: unapofanya kazi na open source, kwanza unafanya fork kwenye tovuti, kisha unanakili fork yako mwenyewe na kuongeza asili kama remote ya pili:
git clone git@github.com:me/project.git
cd project
git remote add upstream https://github.com/author/project.git
git fetch upstream
Makosa ya kawaida ya git clone
«Repository not found»
Kosa la kuandika kwenye anwani, au hifadhi ni ya faragha na huna ruhusa. GitHub kwa makusudi hujibu «not found» badala ya «access denied» kwa hifadhi za faragha. Angalia anwani na uhakikishe umeingia kwenye akaunti sahihi.
«Permission denied (publickey)»
Ni clone ya SSH lakini ufunguo haujasanidiwa. Angalia ssh -T git@github.com, weka ufunguo wa umma kwenye mipangilio ya akaunti, au kwa muda nakili kupitia HTTPS.
«Authentication failed» kwenye HTTPS
Uliandika nenosiri la akaunti. GitHub kwa muda mrefu inahitaji Personal Access Token badala ya nenosiri kwa operesheni za Git kupitia HTTPS. Ikiwa Git imehifadhi taarifa zisizo sahihi — ziondoe kwenye meneja wa akaunti wa mfumo wako.
Kukatika kwenye hifadhi kubwa
Makosa kama early EOF au RPC failed mara nyingi yanasababishwa na mtandao usio thabiti na ukubwa wa hifadhi. Inasaidia clone fupi --depth 1 kisha git fetch --unshallow, au clone kupitia SSH.
Matatizo ya mwisho wa mstari kwenye Windows
Baada ya clone faili zote zinaonekana «zimebadilishwa» — hivi ndivyo ubadilishaji wa CRLF/LF unavyojionyesha. Weka git config --global core.autocrlf true kwenye Windows (au input kwenye Linux na macOS), na ni vizuri pia kuweka sheria kwenye .gitattributes ya mradi.
Cha kufanya mara baada ya kunakili
Clone iko tayari, lakini kabla ya kubadilisha msimbo, tumia dakika chache kujiandaa. Hii itaepusha matatizo ya kawaida siku ya kwanza ya kufanya kazi na mradi wa mtu mwingine.
- Soma README na CONTRIBUTING. Kwa kawaida huko kuna maelezo ya kusakinisha utegemezi, kuendesha majaribio, na jinsi matawi yanavyoitwa kwenye mradi.
- Angalia tawi na hali.
git statusnagit log --oneline -5zitaonyesha uko wapi na mabadiliko ya mwisho ni yapi. - Unda tawi lako. Usifanye kazi moja kwa moja kwenye
main:git switch -c feature/my-task. - Angalia mwandishi wa commits. Ikiwa kwenye kompyuta moja kuna akaunti kadhaa (ya binafsi na ya kazi), weka barua pepe kwa hifadhi hii pekee bila
--global:git config user.email "you@company.com". - Sakinisha utegemezi. Folda kama
node_modulesauvenvhaziwekwi kwenye hifadhi, zinaundwa kwenye kompyuta yako:npm install,pip install -r requirements.txtna kadhalika.
Jinsi ya kuweka clone ikiwa ya sasa
Clone hufanywa mara moja. Baadaye commits mpya za wenzako zinavutwa kutoka origin ile ile:
# Ona kilichofika kwenye seva bila kubadilisha chochote
git fetch
git log --oneline main..origin/main
# Unganisha mabadiliko kwenye tawi la sasa
git pull
Mazoea ya kwanza kufanya git fetch na kuangalia kilichofika yanaokoa dhidi ya conflicts zisizotarajiwa. Usinakili upya mradi «ili usasishe» — hilo hupoteza matawi ya ndani na kazi ambayo haijawekwa commit.
Karatasi ya kudanganya ya git clone
| Kazi | Amri |
|---|---|
| Clone ya kawaida | git clone <url> |
| Kwenye folda yangu | git clone <url> <folda> |
| Moja kwa moja kwenye tawi unalotaka | git clone -b <tawi> <url> |
| Tawi moja tu | git clone -b <tawi> --single-branch <url> |
| Bila historia | git clone --depth 1 <url> |
| Bila maudhui ya faili za zamani | git clone --filter=blob:none <url> |
| Pamoja na submodules | git clone --recurse-submodules <url> |
| Nakala tupu (bare) kwa seva | git clone --bare <url> |
Muhtasari
git clone inapakua hifadhi nzima na mara moja inaweka muunganisho na seva kupitia origin, kwa hiyo baada yake unaweza kufanya commit, push na pull bila usanidi zaidi. Kwa miradi yako tumia SSH, kwa kubwa — --depth au --filter, kwa tawi fulani — -b. Kufanya kazi na hifadhi za mbali, push, pull na fetch vimefafanuliwa kwa vitendo katika kozi ya Git.
Maswali ya mara kwa mara
Git clone inatofautianaje na git pull?
git clone inafanyika mara moja na kuunda nakala mpya ya hifadhi ya ndani. git pull inafanyika kwenye clone iliyopo tayari na kuvuta mabadiliko mapya kutoka seva.
Je, inawezekana kunakili folda moja tu kutoka kwenye hifadhi?
Si moja kwa moja. Karibu zaidi ni clone ya sehemu kwa --filter=blob:none --sparse kisha git sparse-checkout set njia; hapo saraka ya kazi itakuwa na folda unayoihitaji tu.
Clone inachukua nafasi kiasi gani?
Takriban ukubwa wa historia yote kwa fomu iliyobanwa pamoja na faili za toleo la sasa. Ukubwa wa hifadhi unaweza kuonekana kwa amri git count-objects -vH.
Je, inawezekana kunakili hifadhi ya ndani?
Ndiyo, taja njia badala ya anwani: git clone /path/to/repo copy. Ni rahisi kwa majaribio ili nisihatarishe nakala kuu.
Je, inahitajika git init kabla ya git clone?
Hapana. git clone yenyewe inaunda folda na kuianzisha kama hifadhi.
Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.
Nenda kwenye kozi