13 lutego Junio C Hamano poinformował na listach mailingowych gita oraz jądra Linux o wydaniu nowej wersji, zdobywającego coraz większą popularność, rozproszonego systemu kontroli wersji.
Dokładniej o nadchodzącej wersji 1.7 byliśmy informowani m.in. z wydaniem wersji 1.6.6 pod koniec zeszłego roku, gdzie zapowiedziano istotne zmiany w domyślnym zachowaniu podstawowych komend, aby sprawiały mniej problemów. Już od pewnego czasu w najnowszych wersjach gita byliśmy ostrzegani o nich w trakcie wykonywania stosownych komend, łącznie z podaniem wskazówek jak można zachować (ustawić na sztywno) obecne zachowanie. Miało to na celu uniknięcie problemów znanych z poprzednich dużych zmian, kiedy to użytkownicy zwlekali z wcześniejszym dostosowaniem się do nich.
Jakie więc zaszły istotne zmiany?
git push(wysyłanie obiektów do zdalnego repozytorium) do gałęzi, która jest używana w katalogu roboczym (tj. wskazywana przezHEADw nieczystym (ang. not bare) repozytorium) jest teraz domyślnie zabroniony. Analogicznie nie uda się też usuwanie (git push repo :gałąź) takiej gałęzi.Przywrócenie starego i niezdrowego zachowania uzyskujemy poprzez przestawienie zmiennych
receive.denyCurrentBranchorazreceive.denyDeleteCurrentnaignorew repozytorium docelowym.Małym uzupełnieniem może być tu odpowiedź w GitFaq na pytanie: Dlaczego nie zobaczę zmian w zdalnym repozytorium po wykonaniu
git push?git send-emailnie tworzy już domyślnie głębokich wątków (ang. deep threads), wysyłając cały zestaw łat (ang. patch) jako odpowiedź na pierwszy mail, tzw. list motywacyjny (ang. cover letter).Stare zachowanie gwarantuje parametr
--chain-reply-toalbo przestawienie w konfiguracji zmiennejsendemail.chainreplytonatrue.Płytkie wątki (ang.
shallow threads) jako czytelniejsze i tak były zdecydowanie częściej używane na różnego rodzaju listach mailingowych, toteż ta drobna zmiana może nawet się wydawać nieco spóźniona.git statusprzestał naśladowaćgit commitz pominięciem etapu commitowania (do czego powinniśmy używać tożsamego poleceniagit commit --dry-runobecnego od wersji 1.6.5) i pokazuje jedynie stan naszego katalogu roboczego, tzn. różnice między plikiem indeksu a aktualnym commitem wskazywanym przezHEAD(czyli ścieżki do plików, które uległy zmianie w stosunku do drzewa reprezentowanego przez commit wskazywany wHEADi zostały wystawione (ang. staged) do późniejszych operacji [git ls-files --stagevsgit ls-tree -r HEAD]), ścieżki do śledzonych plików z naszego katalogu roboczego, które nie mają zgodnych wpisów w pliku indeksu (inaczej mówiąc, dotyczące je zmiany nie zostały wystawione) i wreszcie ścieżki do nieśledzonych plików, które nie spełniają wzorców ignorowania.Jest to istotna poprawa, ponieważ podając ścieżkę do
git statuszawężamy jedynie obszar jego działania, zamiast, jak to miało miejsce dotychczas, definiować, które ze śledzonych plików mają zostać zacommitowane (co było efektem domyślnie aktywnej opcji--onlyw komendziegit commit). Szczególnie nowi użytkownicy mogli mieć z tym problemy. Siłą rzeczygit statusprzestał teraz obsługiwać parametry commitowania, które wcześniej cicho ignorował.Jeżeli zależy nam na starym zachowaniu, to jak już wcześniej wspomniano, wystarczy zastąpić
git statuskomendągit commit --dry-run.git diffzmienił swoje działanie jeżeli stosujemy ignorowanie białych znaków (--ignore-space-at-eol,--ignore-space-change/-blub--ignore-all-space/-w). Jeżeli pliki różnią się jedynie ignorowanymi znakami, wówczas na wyjściu nie pojawi się dla nich nawet nagłówekdiff --git a/ścieżka/plik b/ścieżka/plik, a przy użyciu dodatkowo opcji--exit-code, kodem wyjścia będzie 0.- Dla zachowania spójności z innymi programami wykonywanymi przez gita, programy pomocnicze typu diff i textconv są teraz wykonywane z pomocą powłoki (ang. shell), pozwalając na przekazywanie do nich parametrów linii komend (ang. command-line parameters). Oznacza to, że jeżeli używaliśmy zmiennej środowiskowej
GIT_EXTERNAL_DIFFlub ustawialiśmy zmiennediff.*.commandlubdiff.*.textconvw pliku konfiguracyjnym, to w przypadku zawierania się w zdefiniowanych tam ścieżkach spacji lub innych metaznaków, muszą zostać wzięte w cytat. - Ostatnia już zmiana to modyfikacja interpretacji argumentu przekazywanego do opcji
--max-pack-sizeużywanej przez komendygit repack,git pack-objectsigit fast-import. Dotychczas traktowano ów argument jak wyrażony w MiB, zamiast w bajtach z obsługą sufiksówk(2^10),m(2^20) ig(2^30), jak ma to miejsce w przypadku różnych zmiennych w konfiguracji czy innych opcji przyjmujących rozmiar jako argument.
Oprócz powyższej listy mamy jeszcze także mniejsze usprawnienia, z których co najmniej kilka pozwolę sobie odnotować:
- poprawiono nieco wydajność w msysgitowym porcie (przeznaczonym dla użytkowników systemu Windows),
- dodano obsługę opcji
--quieti--[no-]progressdo większej liczby komend (np. odpowiednio dogit resetigit clone), - uzupełniono transfer po HTTP o obsługę uwierzytelniania dostępu z pomocą schematów innych niż podstawowy (ang. basic), który przesyła hasła czystym tekstem (ang. plaintext) – aby móc z tego skorzystać, musimy ustawić zmienną
http.authAnyw konfiguracji, a jeżeli interesuje nas konkretnie uwierzytelnianie typu digest, potrzebujemy curla w wersji co najmniej 7.18.1 (z powodu błędów we wcześniejszych wersjach związanych z tym mechanizmem), - dodano opcję
--set-upstreamdo komendygit branchumożliwiającą zmianę upstreamu, - uzupełniono składnię o obsługę zapisu
gałąź@{upstream}pozwalającego na podmianę upstreamu gałęzi, a pominięcie w nim gałęzi jest tożsame z podaniem bieżącej, git grepnie polega już na zewnętrznym grepie i potrafi działać w oparciu o więcej niż jeden wątek aby przyspieszyć operację przeszukiwania.
Zmian jest oczywiście więcej i o wszystkich możecie przeczytać w stosownym anonsie. Źródła jak i dokumentację można znaleźć na stronie git-scm.com.
Na koniec dla tych, co nie śledzą uważnie rozwoju gita, ale mają z nim pewną styczność, chciałbym zauważyć, że istnieje komenda git notes pozwalająca dodawać notatki do commitów bez ich zmieniania. Dla trzymających „żywą dokumentację” w svn-ie, dotychczasowa trudność związana ze zmianą opisu commita (i jej konsekwencje) w gicie była argumentem przeciwko migracji do niego. Problem ten jest rozwiązany począwszy od wersji 1.6.6. Prawda, że wielu z Was przeoczyło tę ciekawą komendę?


Czy ktoś z używających Gita orientuje się czy jest już wygodny sposób zasymulowania centralnego repo na platformie Windows? Ciekawi mnie to, bo fajnie jakby pomysł Gita dało się sprzedać też na tamtą platformę, a tymczasem zyskują takie rozwiązania jak Mercurial. Nic im nie ujmuję, ale jednak fajnie by mieć Gita. 😉
Ja nie wiem co jest takiego w gicie że fajnie go mieć.
Bo co chciałem pobrać jakiś projekt to tak długo to trwało że sobie za każdym razem darowałem a z mercurial nie miałem takich przeżyć.
Ja też ile razy chce się zabrać do GIT-a to wracam skruszony do Hg. Osobiście uważam, że jest tylko jedna rzecz, która czyni GIT-a bardziej atrakcyjnym – łatwość zarządzaniu drzewem zmian. Natomiast co by nie mówić, wciąż GIT-owi brakuje odpowiedniej "karoserii", która jest doprowadzona niemal do perfekcji w Mercurialu i w dodatku nie ma znaczenia czy używamy Win* czy *nix.
A propos, Microsoftowy Codeplex ostatnio też dodał wsparcie dla DVCS, odgadnięcie który pozostawiam jako zadanie dla czytelnika ;).
Dla mnie ,,killer feature'' gita to: git stash, git rebase, git rebase -i, gitk. Później git format-patch, git am.
Nie wiem jak to wygląda w innych DVCS-ach (poza Monotone który oparty jest na zupełnie innych podstawach) — być może podobnie/tak samo. Ale pierwszy raz zobaczyłem to w gicie i dlatego gita używam.
@rsh git klient, oraz serwer (chociaż serwera nie stawiałem), działa na windowsie pod Cygwinem. nawet jakieś gui dla niego jest 😉
@Rsh: Git działa też po HTTP, dostęp do repozytorium można dać używając SSH. Nie jest to tak szybkie jak natywny protokół gita, ale daje rade.
Czyli sensowny protokół po HTTP taki jak ma np. Mercurial nadal w powijakach? Już od kilku lat słyszę, że od następnej wersji w końcu się pojawi a tu dalej prymitywne ściąganie plików za pomocą GET.
Czemu ten ponoć najszybciej i najsprawniej rozwijający się SCM nie może się takiej podstawowej rzeczy dorobić?
Dla kogo podstawowej dla tego podstawowej. Dla mnie podstawowe jest ssh. Po co protokół po http (poza przechodzeniem przez restrykcyjne fw)?
Od wersji 1.6.6, smart HTTP (fetch i push) jest w oficjalnym wydaniu.
No to msysgit ciągle za murzynami…
Właśnie dostępność zza HTTP proxy jest dla mnie istotna, w większości korporacji to jedyny sposób na wyjście na świat i nie zawsze działają tricki z przechodzeniem po porcie 443.
@wojtekm: Po HTTP (prawdopodobnie, bo nie testowałem zbyt długo) najlepiej sprawdza się Fossil. RCS o tyle ciekawy, że bardziej nastawiony na centralne repozytorium niż rozproszoną pracę.
Istnieje opcja pracy offline, commity i merge mają miejsce w lokalnym repozytorium, a nie zdalnym jak w przypadku Gita/Mercuriala. Mocno to uprościłem, bo ciężko to wyjaśnić w kilku słowach. Warto zapoznać się z dokumentacją, objaśniająca koncepcję Fossila.
@blinkkin: Mercurial radzi sobie doskonale po HTTP i jak w każdym DVCS _wszystko_ robi się offline jedynie na koniec synchronizując zmiany.
Ostatnio przyjemnie zaskoczył mnie bazaar. Z wtyczką svn nie czujesz, że używasz innego repo, a program jest superprzenośny i nie widziałem żadnych różnic w działaniu zależnych od platformy. Jeśli jest wtyczka gita to szczerze radzę ci spróbować 😉
Moje doświadczenia z bazaar nie były zachęcające. Podchodziłem do bzr ok. rok temu zaczynając od prostego testu: init niewielkiego lokalnego repo (kilka plików źródłowych), stworzenie kilku jego clone'ów, wykonanie serii prostych modyfikacji na każdej kopii repozytorium, potem próby mergowania zmian w jednym centralnym repozytorium. Po kilku minutach zabawy przy jednej (całkowicie uprawnionej) operacji program odmówił pracy rzuacając exception… Hmmmm. Może od tego czasu stabilność poprawiono, ale póki co stawiam na git – jeszcze mnie nie zawiódł. Nie mogę też złego słowa powiedzieć o Mercurial.
"Ciekawi mnie to, bo fajnie jakby pomysł Gita dało się sprzedać też na tamtą platformę, a tymczasem zyskują takie rozwiązania jak Mercurial. Nic im nie ujmuję, ale jednak fajnie by mieć Gita. "
Msysgit?
Woah! I’m really digging the template/theme of this blog. It’s simple, yet effective. A lot of times it’s challenging to get that „perfect balance” between user friendliness and appearance. I must say you have done a amazing job with this. Additionally, the blog loads super quick for me on Firefox. Exceptional Blog!