Kur „git update-index -assume untained file“ iš tikrųjų išsaugo šią informaciją?

Norėčiau tiesiogiai pakeisti konfigūracijos failus (pvz., .Gitignore ir .git / config), o ne prisiminti savavališkas komandas, bet nežinau, kur „Git“ saugo nuorodas į failus, perkeliamus į „git update -index“ failą be pakeitimų.

Jei žinote, pasakykite man!

9
19 авг. nustatė Mauvis Ledfordas 19 rug . 2011-08-19 01:41 '11 ne 1:41 2011-08-19 01:41
@ 2 atsakymai

Jis sako, kur komanda yra git update-index

Taigi, negalite redaguoti indekso, nes tai nėra tekstinis failas.

Be to, norėdami gauti daugiau informacijos apie tai, kas saugoma naudojant „ git update-index --assume-unchanged , žr.

3
19 авг. atsakymas pateikiamas manojlds 19 rug . 2011-08-19 01:47 '11 at 1:47 2011-08-19 01:47

Kaip kiti sakė, jis yra saugomas indekse, kuris yra .git/index .

Po tam tikro detektyvo darbo aš atradau, kad jis yra adresu: paimkite kiekvieno indekso įrašo bitą kaip tinkamą .

Todėl, prieš tai, ką suprantate, pirmiausia turite suprasti pasaulinį indekso formatą, kaip paaiškinta mano kitame atsakyme .

Be to, aš paaiškinsiu, kaip patvirtinau, kad „įtarimas“ yra kaltininkas:

  • empiriškai
  • skaitant šaltinį

Empirinis

hd laikas

Sąranka:

 git init echo a > b git add b 

Tada:

 hd .git/index 

suteikia:

 00000000 44 49 52 43 00 00 00 02 00 00 00 01 54 e9 b6 f3 |DIRC........T...| 00000010 2d 4f e1 2f 54 e9 b6 f3 2d 4f e1 2f 00 00 08 05 |-O./T...-O./....| 00000020 00 de 32 ff 00 00 81 a4 00 00 03 e8 00 00 03 e8 |..2.............| 00000030 00 00 00 00 e6 9d e2 9b b2 d1 d6 43 4b 8b 29 ae |...........CK.).| 00000040 77 5a d8 c2 e4 8c 53 91 00 01 62 00 c9 a2 4b c1 |wZ....S...b...K.| 00000050 23 00 1e 32 53 3c 51 5d d5 cb 1a b4 43 18 ad 8c |#..2S<Q]....C...| 00000060 

Dabar:

 git update-index --assume-unchanged b hd .git/index 

suteikia:

 00000000 44 49 52 43 00 00 00 02 00 00 00 01 54 e9 b6 f3 |DIRC........T...| 00000010 2d 4f e1 2f 54 e9 b6 f3 2d 4f e1 2f 00 00 08 05 |-O./T...-O./....| 00000020 00 de 32 ff 00 00 81 a4 00 00 03 e8 00 00 03 e8 |..2.............| 00000030 00 00 00 00 e6 9d e2 9b b2 d1 d6 43 4b 8b 29 ae |...........CK.).| 00000040 77 5a d8 c2 e4 8c 53 91 80 01 62 00 17 08 a8 58 |wZ....S...b....X| 00000050 f7 c5 b3 e1 7d 47 ac a2 88 d9 66 c7 5c 2f 74 d7 |....}G....f.\/t.| 00000060 

Palyginus du indeksus ir žiūrint į pasaulinę indekso struktūrą , žiūrėkite, kad vieninteliai skirtumai yra:

  • baitų skaičius 0x48 (9 eilutė 40 ) keičiamas nuo 00 iki 80 . Tai mūsų vėliava, pirmasis talpyklų įvesties vėliavėlių bitas.
  • 20 baitų nuo 0x4C iki 0x5F . Tai tikimasi, nes indeksas yra SHA-1.

Taip yra dėl to, kad SHA-1 indekso įrašai baituose nuo 0x34 iki 0x47 neatsižvelgia į vėliavą, nes jis nepasikeitė tarp dviejų indeksų. Štai kodėl vėliavos dedamos po SHA, kurioje atsižvelgiama tik į tai, kas yra prieš ją.

border=0

Šaltinis

Dabar pažiūrėkime, ar tai atitinka Git 2.3 šaltinio kodą.

Pirmiausia pažiūrėkite į šaltinio atnaujinimo indeksą , grep assume-unchanged .

Tai bus tokia eilutė :

 {OPTION_SET_INT, 0, "assume-unchanged",  NULL, N_("mark files as \"not changing\""), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, MARK_FLAG}, {OPTION_SET_INT, 0, "no-assume-unchanged",  NULL, N_("clear assumed-unchanged bit"), PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, UNMARK_FLAG}, 

todėl ši reikšmė yra išsaugota mark_valid_only . Grep ir nustatykite, kad jis naudojamas tik vienoje vietoje :

 if (mark_valid_only) { if (mark_ce_flags(path, CE_VALID, mark_valid_only == MARK_FLAG)) die("Unable to mark file %s", path); return; } 

CE reiškia talpyklą.

Greitai naršant pažymėkite „mark_ce_flags“, kad:

 if (mark) active_cache[pos]->ce_flags |= flag; else active_cache[pos]->ce_flags  ~flag; 

Taigi ši funkcija iš esmės nustato arba siunčia CE_VALID bitą, priklausomai nuo mark_valid_only , kuris yra trijų pakopų:

  • ženklas: - --assume-unchanged
  • atžymėti: --no-assume-unchanged
  • nieko nedaryti: numatytoji reikšmė yra 0 parametro, nustatyto {OPTION_SET_INT, 0

Be to, matydami pastatytą builtin/ , matome, kad jokia kita vieta nenustato CE_VALID , taigi - --assume-unchanged turėtų būti vienintelė komanda, kuri ją nustato.

Tačiau vėliava daugelyje vietų naudojama pradiniame kode, kuris, kaip tikimasi, yra daug, nes jis turi daug šalutinių poveikių ir jis naudojamas kiekvieną kartą, pvz .:

 ce->ce_flags  CE_VALID 

todėl darome išvadą, kad tai yra struct cache_entry ce_flags struct cache_entry .

Indeksas yra nurodytas cache.h , nes viena iš jos funkcijų yra sparčiai kuriant įsipareigojimus.

Studijuojant CE_VALID apibrėžimą pagal cache.h ir aplinkines linijas, turime:

 #define CE_STAGEMASK (0x3000) #define CE_EXTENDED (0x4000) #define CE_VALID (0x8000) #define CE_STAGESHIFT 12 

Taigi darome išvadą, kad tai yra pirmasis šio sveikojo skaičiaus 0x8000 ( 0x8000 ), šalia CE_EXTENDED , kuris atitinka mano ankstesnį eksperimentą .

2
22 февр. Ciro Santilli atsakymas 法轮功 子 露 宪 六四 事件 法轮功 Feb 22 2015-02-22 14:05 '15, 14:05 pm 2015-02-22 14:05

Kiti klausimai apie „ žymes arba „ Klauskite klausimą“