Mwongozo

git clone: jinsi ya kunakili hifadhi kutoka GitHub na kwingineko

Imesasishwa: · Skillaria.Top

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:

  1. inaunda folda na kutekeleza ndani yake kitu sawa na git init;
  2. inaongeza remote yenye jina origin, inayoelekeza kwenye anwani ya asili;
  3. inapakua vitu vyote na marejeo — sawa na git fetch;
  4. inaunda matawi ya mbali origin/main, origin/develop na kadhalika;
  5. inaunda tawi la ndani la chaguo-msingi (kwa kawaida main), kulifungamanisha na origin/main na 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

HTTPSSSH
Anwanihttps://github.com/user/repo.gitgit@github.com:user/repo.git
Hifadhi ya ummaInanakiliwa bila kuingiaInahitaji ufunguo wa SSH uliowekwa kwenye akaunti
Hifadhi ya faragha, pushInahitaji Personal Access Token badala ya nenosiriInafanya kazi kwa ufunguo, bila kuandika nenosiri
Mitandao ya kampuniBandari 443 karibu kila mara iko waziBandari 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

NjiaUnachopataLini kutumia
git cloneHifadhi kamili yenye historia na remoteKazi kwenye mradi ambapo una ruhusa au unahitaji historia
Fork kwenye GitHubNakala ya hifadhi kwenye akaunti yako kwenye sevaKuchangia mradi wa mtu mwingine kwa pull request
Download ZIPFaili tu, bila .gitKutazama 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.

  1. Soma README na CONTRIBUTING. Kwa kawaida huko kuna maelezo ya kusakinisha utegemezi, kuendesha majaribio, na jinsi matawi yanavyoitwa kwenye mradi.
  2. Angalia tawi na hali. git status na git log --oneline -5 zitaonyesha uko wapi na mabadiliko ya mwisho ni yapi.
  3. Unda tawi lako. Usifanye kazi moja kwa moja kwenye main: git switch -c feature/my-task.
  4. 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".
  5. Sakinisha utegemezi. Folda kama node_modules au venv haziwekwi kwenye hifadhi, zinaundwa kwenye kompyuta yako: npm install, pip install -r requirements.txt na 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

KaziAmri
Clone ya kawaidagit clone <url>
Kwenye folda yangugit clone <url> <folda>
Moja kwa moja kwenye tawi unalotakagit clone -b <tawi> <url>
Tawi moja tugit clone -b <tawi> --single-branch <url>
Bila historiagit clone --depth 1 <url>
Bila maudhui ya faili za zamanigit clone --filter=blob:none <url>
Pamoja na submodulesgit clone --recurse-submodules <url>
Nakala tupu (bare) kwa sevagit 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.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Git kutoka mwanzo hadi msanidi programu anayejiweza”.

Nenda kwenye kozi