Kaip retai gauti tik vieną failą iš „git“ saugyklos?

Kaip patikrinti tik vieną failą iš „git repo“?

372
18 марта '10 в 2:52 2010-03-18 02:52 Arthur Ulfeldt paklausė kovo 18 d., 10:52, 2010-03-18 02:52
@ 19 atsakymų

Iš pradžių 2012 m. git archive sakiau (žr. Jared Forsyth atsakymą ir Robert Knight už atsakymą ), nes atsakymas buvo pateiktas 1.7.9.5 (2012 m. Kovo mėn.) , Paul Brennan už atsakymą :

 git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf - 

Tačiau: 2013 m. Buvo neįmanoma nuotolinių URL https://github.com .
Žr. Senąjį puslapį „ Ar galiu archyvuoti skliautą?

Dabartiniame (2018 m.) Puslapyje „ Apie turinio ir duomenų archyvavimą„ GitHub ““ rekomenduojama naudoti trečiųjų šalių paslaugas, pvz., „ GHTorrent“ arba „ GH Archive“ .


Taip pat galite spręsti vietines kopijas / klonus:

Taip pat galite atlikti šiuos veiksmus, jei turite vietinės grynosios saugyklos kopiją, kaip nurodyta šiame atsakyme .

 git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file 

Arba pirmiausia turite klonuoti repo, ty gauti pilną istoriją: - .git saugykloje - darbo medyje.

  • Bet tada galite atlikti retą patikrinimą (jei naudojate Git1.7 +),
    • įjungti nedidelio čekio parinktį ( git config core.sparsecheckout true )
    • pridėkite, ką norite matyti .git/info/sparse-checkout
    • perskaitykite darbo medį, kad matytumėte tik tai, ko jums reikia

Norėdami perskaityti darbo medį:

 $ git read-tree -m -u HEAD 

Tokiu būdu gausite darbo medį, kuriame yra būtent tai, ko norite (net jei tai tik vienas failas)

225
18 марта '10 в 7:58 2010-03-18 07:58 atsakymą pateikė VonC kovo 18 d., 10 d., 7:58, 2010-03-18 07:58

Pirma, klonuokite repo su -n parinktimi, kuri slopina standartinį visų failų patikrinimą ir -depth 1 parinktį, o tai reiškia, kad ji gauna naujausią kiekvieno failo versiją

 git clone -n git://path/to/the_repo.git --depth 1 

Tada patikrinkite tik reikalingą failą:

 cd the_repo git checkout HEAD name_of_file 
163
18 марта '10 в 2:58 2010-03-18 02:58 atsakė Nick Moore'ui kovo 10 d., 10:58 2010-03-18 02:58

Jei jau turite „git“ saugyklos kopiją, visada galite patikrinti failo versiją su „ git log kad sužinotumėte „hash-id“ (pvz., 3cdc61015724f9965575ba954c8cd4232c8b42e4), tada tiesiog įveskite:

 git checkout hash-id path-to-file 

Štai pavyzdys:

 git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css 
98
27 июня '12 в 22:14 2012-06-27 22:14 Atsakymą pateikia „ techexpert“ birželio 27 d. 12 val. 10:14 val. 2012-06-27 22:14

Paprastai negalima atsisiųsti tik vieno failo iš „git“, neperkeldami visos saugyklos, kaip siūloma pirmame atsakyme. Taip yra todėl, kad git nesaugo jūsų nuomone (pvz., CVS / SVN), bet generuoja juos pagal visą projekto istoriją.

Tačiau tam tikrais atvejais yra tam tikrų problemų. Žr. Toliau:

Github

Jei šis failas yra „github.com“, pabandykite, pavyzdžiui:

 wget https://raw.githubusercontent.com/user/project/master/README 

„Gitweb“

Jei serveryje naudojate „ Git“ - „GitWeb“ , pavyzdyje galite pabandyti (pakeisti jį į teisingą kelią):

 wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD" 

„Gitweb“ svetainėje drupalcode.org

Pavyzdys:

 wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md" 

googlesource.com

Yra nepatvirtinta funkcija, leidžianti atsisiųsti neapdorotų failų versijas su base64 kodavimu:

 curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode 

Kitais atvejais patikrinkite, ar jūsų git saugykla naudoja bet kokias tinklo sąsajas.

Jei jis nenaudoja jokios interneto sąsajos, galite apsvarstyti galimybę nukreipti kodą į išorines paslaugas, pvz., „ GitHub“ , „ Bitbucket“ ir kt. . ir naudokite jį kaip veidrodį.

Jei neturite „ wget , pabandykite „ curl -O (url) alternatyviai.

45
08 февр. atsakymas pateikiamas kenorb 08 Feb. 2013-02-08 22:30 '13, 10:30 val. 2013-02-08 22:30

git checkout branch_or_version - kelias / failas

pavyzdys: git checkout HEAD -- main.c

36
30 мая '12 в 5:17 2012-05-30 05:17 Atsakymą davė Thomas Brushington gegužės 30 d., 12:17 2012-05-30 05:17

Minimalus vadovas

git checkout -- <filename>


Nuoroda: https://git-scm.com/docs/git-checkout

Dup: atšaukti vieno failo kopijas git?

33
07 нояб. Geoffrey Hale atsakymas, lapkričio 7 d. 2015-11-07 05:06 '15 at 5:06 2015-11-07 05:06

Darbas GIT 1.7.2.2

Pvz., Turite tam tikrą_remote pašalinimą su filialų šaka1 , filialu32

todėl, norėdami patikrinti konkretų failą, skambinate šiomis komandomis:

 git checkout remote/branch path/to/file 

kaip pavyzdys bus kažkas panašaus

 git checkout some_remote/branch32 conf/en/myscript.conf git checkout some_remote/branch1 conf/fr/load.wav 

Ši patvirtinimo komanda nukopijuos visą konfigūravimo ir konfigūravimo failo struktūrą į dabartinį katalogą, kuriame naudojatės šiomis komandomis (žinoma, manau, kad anksčiau buvote paleisti GIT init)

21
06 июля '11 в 20:54 2011-07-06 20:54 atsakymas pateikiamas anvk liepos 06 d. 11 val. 20:54 2011-07-06 20:54

Dabar mes galime! Kadangi tai yra pirmasis „Google“ rezultatas, nusprendžiau jį atnaujinti į naujausią versiją. Su git 1.7.9.5, mes turime git archive komandą, kuri leis jums gauti vieną failą iš nuotolinio kompiuterio.

 git archive --remote=git://git.foo.com/project.git HEAD:path/in/repo filename | tar -x 

Visą atsakymą rasite čia ngn-wiki.ru.site/questions/7608 / ...

18
10 сент. Atsakymą pateikė Jared Forsyth 10 rugsėjis. 2013-09-10 10:14 '13, 10:14, 2013-09-10 10:14

Labai paprasta:

 git checkout from-branch-name -- path/to/the/file/you/want 

Tai from-branch-name . Jūs liksite bet kuriame filiale, kuriame esate, ir tik vienas failas bus išgautas iš nurodyto filialo.

Čia yra atitinkama „ git-checkout puslapio dalis

 git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>... When <paths> or --patch are given, git checkout does not switch branches. It updates the named paths in the working tree from the index file or from a named <tree-ish> (most often a commit). In this case, the -b and --track options are meaningless and giving either of them results in an error. The <tree-ish> argument can be used to specify a specific tree-ish (ie commit, tag or tree) to update the index for the given paths before updating the working tree. 

Hat taryba Arienne de Vroom, kuris mane išmokė.

12
21 апр. atsakymas duotas broc.seib 21 Bal 2015-04-21 06:14 '15 at 6:14 2015-04-21 06:14

Tai galite padaryti su

 git archive --format=tar --remote=origin HEAD | tar xf - git archive --format=tar --remote=origin HEAD <file> | tar xf - 
6
13 февр. Atsakymą pateikė Fizer Khan , vasario 13 d. 2014-02-13 16:24 '14 at 16:24 2014-02-13 16:24

Dvi jau pateiktos versijos:

 git archive --format=tar --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -O -xf - 

ir

 git archive --format=zip --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | funzip 

Jie rašo failą į standartinę išvestį.

5
21 окт. Paul Brannan atsakymas spalio 21 d 2013-10-21 21:08 '13, 21:08 2013-10-21 21:08

git clone --filtergit clone --filter 2.19

Ši parinktis iš tikrųjų praleidžia serverio nereikalingų objektų pavyzdį:

 git clone --depth 1 --no-checkout --filter=blob:none \ "file://$(pwd)/server_repo" local_repo cd local_repo git checkout master -- mydir/myfile 

Serveris turi būti sukonfigūruotas su:

 git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 

Pradedant nuo versijos v2.19.0, serveris nepalaikomas, tačiau jis jau gali būti išbandytas vietoje.

TODO: --filter=blob:none visų „BLOB“, bet vis dar pasirenka visus medžio objektus. Tačiau reguliariai atpirkus tai turėtų būti maža, palyginti su pačiais failais, todėl tai jau gana gera. Į klausimą: https://www.spinics.net/lists/git/msg342006.html Kūrėjai atsakė --filter=tree:0 , kad tai padarytų.

Nepamirškite, kad --depth 1 --single-branch --depth 1 jau reiškia, --single-branch , taip pat žr.

file://$(path) reikalingas, norint įveikti git clone protokolu: kaip atšaukti vietinio git saugyklos klonavimą santykiniu keliu?

--filter formatas --filter dokumentuojamas man git-rev-list .

Siekiant palaikyti šią funkciją, buvo sukurtas „Git“ nuotolinio protokolo išplėtimas.

„Git“ dokumentai:

Patikrinkite

 #!/usr/bin/env bash set -eu list-objects() ( git rev-list --all --objects echo "master commit SHA: $(git log -1 --format="%H")" echo "mybranch commit SHA: $(git log -1 --format="%H")" git ls-tree master git ls-tree mybranch | grep mybranch git ls-tree master~ | grep root ) # Reproducibility. export GIT_COMMITTER_NAME='a' export GIT_COMMITTER_EMAIL='a' export GIT_AUTHOR_NAME='a' export GIT_AUTHOR_EMAIL='a' export GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' export GIT_AUTHOR_DATE='2000-01-01T00:00:00+0000' rm -rf server_repo local_repo mkdir server_repo cd server_repo # Create repo. git init --quiet git config --local uploadpack.allowfilter 1 git config --local uploadpack.allowanysha1inwant 1 # First commit. # Directories present in all branches. mkdir d1 d2 printf 'd1/a' > ./d1/a printf 'd1/b' > ./d1/b printf 'd2/a' > ./d2/a printf 'd2/b' > ./d2/b # Present only in root. mkdir 'root' printf 'root' > ./root/root git add . git commit -m 'root' --quiet # Second commit only on master. git rm --quiet -r ./root mkdir 'master' printf 'master' > ./master/master git add . git commit -m 'master commit' --quiet # Second commit only on mybranch. git checkout -b mybranch --quiet master~ git rm --quiet -r ./root mkdir 'mybranch' printf 'mybranch' > ./mybranch/mybranch git add . git commit -m 'mybranch commit' --quiet echo "# List and identify all objects" list-objects echo # Restore master. git checkout --quiet master cd .. # Clone. Don't checkout for now, only .git/ dir. git clone --depth 1 --quiet --no-checkout --filter=blob:none "file://$(pwd)/server_repo" local_repo cd local_repo # List missing objects from master. echo "# Missing objects after --no-checkout" git rev-list --all --quiet --objects --missing=print echo echo "# Git checkout fails without internet" mv ../server_repo ../server_repo.off ! git checkout master echo echo "# Git checkout fetches the missing file from internet" mv ../server_repo.off ../server_repo git checkout master -- d1/a echo echo "# Missing objects after checking out d1/a" git rev-list --all --quiet --objects --missing=print 

GitHub aukštyn .

Išeiti į Git v2.19.0:

 # List and identify all objects c6fcdfaf2b1462f809aecdad83a186eeec00f9c1 fc5e97944480982cfc180a6d6634699921ee63ec 7251a83be9a03161acde7b71a8fda9be19f47128 62d67bce3c672fe2b9065f372726a11e57bade7e b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 308150e8fddde043f3dbbb8573abb6af1df96e63 d1/a f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b 84de03c312dc741d0f2a66df7b2f168d823e122a d2 0975df9b39e23c15f63db194df7f45c76528bccb d2/a 41484c13520fcbb6e7243a26fdb1fc9405c08520 d2/b 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 8b25206ff90e9432f6f1a8600f87a7bd695a24af master/master ef29f15c9a7c5417944cc09711b6a9ee51b01d89 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 1b671b190e293aa091239b8b5e8c149411d00523 mybranch/mybranch c3760bb1a0ece87cdbaf9a563c77a45e30a4e30e a0234da53ec608b54813b4271fbf00ba5318b99f root 93ca1422a8da0a9effc465eccbcb17e23015542d root/root master commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec mybranch commit SHA: fc5e97944480982cfc180a6d6634699921ee63ec 040000 tree b64bf435a3e54c5208a1b70b7bcb0fc627463a75 d1 040000 tree 84de03c312dc741d0f2a66df7b2f168d823e122a d2 040000 tree 7d5230379e4652f1b1da7ed1e78e0b8253e03ba3 master 040000 tree 19f7a4ca4a038aff89d803f017f76d2b66063043 mybranch 040000 tree a0234da53ec608b54813b4271fbf00ba5318b99f root # Missing objects after --no-checkout ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb ?308150e8fddde043f3dbbb8573abb6af1df96e63 # Git checkout fails without internet fatal: '/home/ciro/bak/git/test-git-web-interface/other-test-repos/partial-clone.tmp/server_repo' does not appear to be a git repository fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. # Git checkout fetches the missing directory from internet remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0) Receiving objects: 100% (1/1), 45 bytes | 45.00 KiB/s, done. # Missing objects after checking out d1 ?f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 ?8b25206ff90e9432f6f1a8600f87a7bd695a24af ?41484c13520fcbb6e7243a26fdb1fc9405c08520 ?0975df9b39e23c15f63db194df7f45c76528bccb 

Išvados: visi lašai, išskyrus d1/a , nėra. Pvz., f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 d1/b , f70a17f51b7b30fec48a32e4f19ac15e261fd1a4 , ty d1/b , nėra.

Atkreipkite dėmesį, kad taip pat trūksta root/root ir „ mybranch/mybranch , tačiau --depth 1 slepia tai iš trūkstamų failų sąrašo. Jei ištrinsite --depth 1 --depth 1 , trūkstamų failų sąraše jie yra --depth 1 .

4
11 сент. Ciro Santilli atsakymas 改造 改造 中心 六四 事件 法轮功 11 Sep 2018-09-11 10:12 '18, 10:12 pm 2018-09-11 10:12

Tarkime, kad failo pavadinimas yra 123.txt, jis veikia man:

 git checkout --theirs 123.txt 

Jei failas yra kataloge A, įsitikinkite, kad jis teisingai nurodytas:

 git checkout --theirs "A/123.txt" 
4
08 дек. Atsakymą pateikė Joseph Wu, gruodžio 8 d. 2015-12-08 05:54 '15 at 5:54 2015-12-08 05:54

Be „git“, prieš juos atnaujindami, „tikrinate“ failus . Atrodo, kad būtent tai jums reikia.

Daugelis sistemų, pvz., „Clearcase“, „csv“ ir pan., Reikalauja, kad prieš atlikdami pakeitimus, atliktumėte „checkout“ failą. tai nereikalauja. Klonate saugyklą ir atlikite vietinės kapinyno kopijos pakeitimus.

Atnaujinus failus, galite:

 git status 

Norėdami sužinoti, kurie failai buvo pakeisti. Pridėkite tuos, kuriuos norite nukopijuoti į index , pirmiausia ( index , kurį norite patikrinti):

 git add . 

arba

 git add blah.c 

Tada „ git status parodys, kurie failai buvo pakeisti ir kurie yra index yra pasiruošę atlikti arba patikrinti.

Jei norite padaryti rinkmenų kopiją savo saugykloje, atlikite:

 git commit -a -m "commit message here" 

Žiūrėkite „ git svetainę, kurioje rasite nuorodas į vadovus ir vadovus.

4
18 марта '10 в 3:08 2010-03-18 03:08 atsakė stefanB kovo 18 d. 10 d. 03:08 2010-03-18 03:08

Atrodo, kad jūs bandote perkelti idėją iš centralizuotos versijos kontrolės, kurios git nėra savo pobūdžiu - plinta. Jei norite dirbti su git repozitoriumu, jį klonuokite. Tada turite visą darbo medžio turinį ir visą istoriją (gerai, bent jau viską, kas pasiekia dabartinės šakos viršūnę), o ne tik vieną failą ar vieno fiksavimo momentinę nuotrauką.

  git clone /path/to/repo git clone git://url/of/repo git clone http://url/of/repo 
1
18 марта '10 в 3:03 2010-03-18 03:03 atsakymą pateikė Cascabel, kovo 18 d., 10 d., 03:03 2010-03-18 03:03

Aš nematau, kas čia dirbo, todėl aš jį įjungsiu, jei kas nors yra mano situacijoje.

Mano situacijoje turiu nuotolinį saugyklą, galbūt 10 000 failų, ir turiu sukurti RPM failą mano „Linux“ sistemai. RPM statybai priklauso gito klonas. Viskas, ko man reikia, yra vienas failas, skirtas paleisti RPM. Galiu klonuoti visą šaltinio medį, kuris daro tai, ko man reikia, bet užtrunka dar dvi minutes, kad būtų galima atsisiųsti visus šiuos failus, kai tik man reikia. Bandžiau naudoti aptartą „git“ archyvo parinktį ir gauti „mirtiną: protokolas nepalaiko operacijos“. Atrodo, kad aš turiu įjungti tam tikrą archyvavimo parinktį serveryje, o mano serverį aptarnauja biurokratai, kurie, atrodo, norėtų, kad jų užduotys būtų sudėtingos.

Galų gale aš prisijungiau prie interneto sąsajos, kad galėčiau bituuti, ir pažvelgiau į vieną reikalingą failą. Dešiniuoju pelės klavišu spustelėjau nuorodą, kad atsisiųstumėte neperdirbtą failo kopiją, ir pasirodžiusiame iššokančiame >

Dėl diskusijos, vedančios į URL:

 https://ourArchive.ourCompany.com/projects/ThisProject/repos/data/raw/foo/bar.spec?at=refs%2Fheads%2FTheBranchOfInterest 

Negalėjau tiesiogiai atsisiųsti šio failo iš bituminės talpyklos, nes turėjau prisijungti pirmiausia. Truputį pamažu pastebėjau, kad jis veikia: „Linux“:

 echo "myUser:myPass123"| base64 bXlVc2VyOm15UGFzczEyMwo= curl -H 'Authorization: Basic bXlVc2VyOm15UGFzczEyMwo=' 'https://ourArchive.ourCompany.com/projects/ThisProject/repos/data/raw/foo/bar.spec?at=refs%2Fheads%2FTheBranchOfInterest' > bar.spec 

Šis derinys leido man įkelti vieną failą, kurį reikia surinkti.

0
18 сент. atsakymą pateikė vartotojo1683793 18 sep . 2018-09-18 03:04 '18, 08:04 nuo 2018-09-18 03:04

Jei reikalingas konkretus failas iš tam tikros šakos iš nuotolinio „Git“ saugyklos, komanda:

 git archive --remote=git://git.example.com/project.git refs/heads/mybranch path/to/myfile |tar xf - 

Likusią dalį galima gauti iš atsakymo @VonC:

Jei reikia pagrindinio failo iš pagrindinio filialo, tai yra:

 git archive --remote=git://git.example.com/project.git HEAD path/to/myfile |tar xf - 

Jei reikalingas konkretus failas iš žyma, jis:

 git archive --remote=git://git.example.com/project.git mytag path/to/myfile |tar xf - 
0
08 июля '17 в 14:04 2017-07-08 14:04 Atsakymą pateikė Alex Harvey , liepos 8 d. 17 d. 14:04 2017-07-08 14:04

Jei jums reikia tik įkelti failą, nereikia jo patikrinti su „Git“.

GitHub Mate yra daug lengviau tai padaryti, tai yra „Chrome“ plėtinys, leidžiantis spustelėti failo piktogramą. taip pat atviro kodo

0
18 дек. Atsakymas „ Cam song“ 18 d. 2013-12-18 08:29 '13, 08:29 2013-12-18 08:29

Jei redagavote vietinę failo versiją ir norite grįžti prie pradinės versijos, palaikomos centriniame serveryje, tai galima lengvai pasiekti naudojant „ Git Extensions“ .

  • Iš pradžių failas bus pažymėtas kaip įsipareigojimas, nes jis buvo pakeistas
  • Failo medžio meniu pasirinkite (dukart spustelėkite) failą
  • Rodomas vieno failo peržiūros medis.
  • Pasirinkite medžio viršuje / viršuje ir dešiniuoju pelės klavišu spustelėkite įrašymą kaip
  • Įrašykite failą, kad pakeistumėte pakeistą vietinę failo versiją.
  • Dabar failas turi teisingą versiją ir nebebus pažymėtas kaip įsipareigojimas!

Lengva!

-3
11 авг. Robert Taylor atsakymas, pateiktas rugpjūčio 11 d 2015-08-11 13:39 '15, 13:39 pm 2015-08-11 13:39

Kiti klausimai apie „ žymas arba „ Klauskite“