Nasi programiści używają kombinacji systemów operacyjnych Windows i Unix. Dlatego dowiązania symboliczne utworzone na maszynach Unix stają się problemem dla programistów Windows. W systemie Windows (msysgit) dowiązanie symboliczne jest konwertowane na plik tekstowy ze ścieżką do pliku, na który wskazuje. Zamiast tego chciałbym przekonwertować dowiązanie symboliczne w rzeczywiste dowiązanie symboliczne Windows.
Mam ( zaktualizowane ) rozwiązanie tego problemu:
- Napisz skrypt po kasie, który będzie rekurencyjnie szukał plików tekstowych „dowiązanie symboliczne”.
- Zastąp je symlink Windows (używając mklink) o tej samej nazwie i rozszerzeniu co atrapa „symlink”
- Zignoruj te dowiązanie symboliczne systemu Windows, dodając wpis do .git / info / exclude
Nie wdrożyłem tego, ale uważam, że jest to solidne podejście do tego problemu.
Pytania:
- Jakie są wady tego podejścia?
- Czy ten skrypt po wykonaniu transakcji jest nawet możliwy do wdrożenia? tj. czy mogę rekurencyjnie dowiedzieć się, jakie pliki git „symlink” tworzy git?
- Czy ktoś już pracował nad takim skryptem?
Odpowiedzi:
Możesz znaleźć dowiązania symboliczne, szukając plików o trybie
120000
, prawdopodobnie za pomocą tego polecenia:Po wymianie linków zalecam oznaczanie ich jako niezmienionych
git update-index --assume-unchanged
zamiast wpisywania ich.git/info/exclude
.źródło
git ls-files -s | grep '^12' | cut -f2
(druga kolumna rozdzielana tabulatorami; inne kolumny są rozdzielanefor f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
Zadałem to samo pytanie jakiś czas temu (nie tutaj, ogólnie) i znalazłem bardzo podobne rozwiązanie do propozycji OP. Najpierw udzielę bezpośrednich odpowiedzi na pytania 1 2 i 3, a następnie opublikuję rozwiązanie, z którego ostatecznie skorzystałem.
git checkout
krok po kroku, ale poniższe rozwiązanie spełniło moje potrzeby na tyle dobrze, że dosłowny skrypt po przejściu do kasy nie był konieczny.Rozwiązanie:
Nasi programiści znajdują się w podobnej sytuacji co OP: mieszanka hostów Windows, Unix, repozytoriów i podmodułów z wieloma dowiązaniami symbolicznymi git oraz brak natywnej obsługi (jeszcze) w wersji MsysGit dla inteligentnej obsługi tych dowiązań symbolicznych na hostach Windows .
Dzięki Josh Lee za zwrócenie uwagi na fakt, że git zatwierdza dowiązania symboliczne ze specjalnym trybem pliku
120000
. Dzięki tym informacjom można dodać kilka aliasów git, które pozwalają na tworzenie i manipulowanie dowiązaniami symbolicznymi git na hostach Windows.Tworzenie dowiązań symbolicznych git w systemie Windows
Zastosowanie:
git add-symlink <source_file_or_dir> <target_symlink>
gdzie argument odpowiadający plikowi źródłowemu lub katalogowi musi mieć postać ścieżki względem docelowego dowiązania symbolicznego. Możesz użyć tego aliasu w taki sam sposób, jak zwykleln
.Np. Drzewo repozytorium:
Można go utworzyć w systemie Windows w następujący sposób:
Zamiana dowiązań symbolicznych git na dowiązania twarde NTFS + połączenia
Stosowanie:
Ten alias może usuwać dowiązania symboliczne git jeden po drugim lub naraz za jednym zamachem. Dowiązania symboliczne zostaną zastąpione dowiązaniami stałymi NTFS (w przypadku plików) lub połączeniami NTFS (w przypadku katalogów). Zaletą używania hardlinks + skrzyżowań nad „prawdziwymi” dowiązaniami symbolicznymi NTFS jest to, że podwyższone uprawnienia UAC nie są wymagane do ich utworzenia.
Aby usunąć dowiązania symboliczne z podmodułów, po prostu użyj wbudowanej obsługi git do iteracji nad nimi:
Ale w przypadku każdego takiego drastycznego działania miło jest mieć odwrócenie ...
Przywracanie dowiązań symbolicznych git w systemie Windows
Użycie
git checkout-symlinks [symlink] [symlink] [...]
:, które się cofagit rm-symlinks
, skutecznie przywracając repozytorium do jego naturalnego stanu (z wyjątkiem zmian, które powinny pozostać nienaruszone).A dla podmodułów:
Ograniczenia:
Katalogi / pliki / dowiązania symboliczne ze spacjami na ścieżkach powinny działać. Ale karty czy nowe linie? YMMV… (Rozumiem przez to: nie rób tego, ponieważ to nie zadziała.)
Jeśli ty lub inni zapomnicie,
git checkout-symlinks
zanim zrobicie coś o potencjalnie szerokich konsekwencjach, npgit add -A
. Lokalne repozytorium może skończyć się zanieczyszczonym stanem.Korzystając z naszego „przykładowego repozytorium” sprzed:
Ups ...
Z tego powodu fajnie jest dołączyć te aliasy jako kroki do wykonania dla użytkowników systemu Windows przed i po zbudowaniu projektu, a nie po kasie lub przed wypchnięciem. Ale każda sytuacja jest inna. Te aliasy były dla mnie na tyle przydatne, że prawdziwe rozwiązanie po przejściu do kasy nie było konieczne.
Mam nadzieję, że to pomaga!
Bibliografia:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
Ostatnia aktualizacja: 13.03.2019
mklink
wywołań, oczywiście) - koniec z bashizmami !add-symlink
Alias działa teraz podobnie ln (1) i może być używany z dowolnym katalogu w repozytorium, a nie tylko katalogu głównego repozytorium.rm-symlink
Ps (pojedyncza) został zastąpiony przezrm-symlinks
alias (mnoga), który obecnie przyjmuje wiele argumentów (lub żadnych parametrów w ogóle, która znajduje wszystkich dowiązania przez repozytorium, jak poprzednio), dla selektywnego przekształcenia symlinki git w NTFS hardlinki + węzłów .checkout-symlinks
Alias została zaktualizowana, aby zaakceptować wiele argumentów (lub wcale, == wszystko) do selektywnego odwrócenia wspomnianych przekształceń.Uwaga końcowa: podczas gdy testowałem ładowanie i uruchamianie tych aliasów przy użyciu Bash 3.2 (a nawet 3.1) dla tych, którzy nadal mogą utknąć na tak starożytnych wersjach z wielu powodów, pamiętaj, że wersje tak stare jak te są znane ze względu na parser robaki. Jeśli wystąpią problemy podczas próby zainstalowania któregokolwiek z tych aliasów, pierwszą rzeczą, na którą powinieneś zwrócić uwagę, jest aktualizacja powłoki (w przypadku Bash sprawdź wersję za pomocą CTRL + X, CTRL + V). Alternatywnie, jeśli próbujesz je zainstalować, wklejając je do emulatora terminala, możesz mieć więcej szczęścia wklejając je do pliku i zamiast tego, np. Jako
Powodzenia!
źródło
git add-symlink
przepis był dla mnie fantastycznie cenny. Wielkie dzięki.Najnowsza wersja git scm (testet 2.11.1) umożliwia włączanie dowiązań symbolicznych. Ale musisz ponownie sklonować repozytorium za pomocą dowiązań symbolicznych
git clone -c core.symlinks=true <URL>
. Musisz uruchomić to polecenie z uprawnieniami administratora. Możliwe jest również tworzenie dowiązań symbolicznych w systemie Windows za pomocą mklink. Sprawdź wiki .źródło
tslint.json
plik odwołujący się do pliku w katalogu nadrzędnym nadal zawiera../tslint.json
. Szkoda, bo to naprawdę wyglądało na najłatwiejsze ze wszystkich proponowanych tam rozwiązań.git clone -c core.symlinks=true <URL>
A w systemie Windows musisz go uruchomić z uprawnieniami administratora.Powinien zostać zaimplementowany w msysgit, ale są dwie wady:
Przeprowadziłem szybkie wyszukiwanie i nad tym trwają prace, patrz problem 224 .
źródło
tak więc, jak zmieniło się w GIT od czasu opublikowania wielu odpowiedzi tutaj, są prawidłowe instrukcje, aby linki symboliczne działały poprawnie w systemie Windows od
SIERPIEŃ 2018
1. Upewnij się, że git jest zainstalowany z obsługą dowiązań symbolicznych
2. Powiedz Bashowi, aby tworzył dowiązania twarde zamiast dowiązań symbolicznych
EDYCJA - (folder git) /etc/bash.bashrc
DODAJ DO DOLNEJ -
MSYS=winsymlinks:nativestrict
3. Ustaw git config, aby używał dowiązań symbolicznych
lub
UWAGA: Próbowałem dodać to do globalnej konfiguracji git iw tej chwili nie działa dla mnie, więc polecam dodanie tego do każdego repo ...
4. wyciągnij repozytorium
UWAGA: Jeśli nie włączyłeś trybu programisty w najnowszej wersji systemu Windows 10, musisz uruchomić bash jako administrator, aby utworzyć dowiązania symboliczne
5. Zresetuj wszystkie dowiązania symboliczne (opcjonalnie) Jeśli masz istniejące repozytorium lub korzystasz z submodułów, może się okazać, że dowiązania symboliczne nie są tworzone poprawnie, więc aby odświeżyć wszystkie dowiązania symboliczne w repozytorium, możesz uruchomić te polecenia.
UWAGA: spowoduje to zresetowanie wszelkich zmian od ostatniego zatwierdzenia, więc upewnij się, że dokonałeś pierwszego
źródło
Krótka odpowiedź: są teraz ładnie obsługiwane, jeśli możesz włączyć tryb programisty.
Od https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/
Łatwo przeoczyć wszystkie pozostałe ogłoszenia „Aktualizacja twórcy”, ale jeśli włączysz tryb programisty, możesz tworzyć dowiązania symboliczne bez podwyższonych uprawnień. Być może będziesz musiał ponownie zainstalować git i upewnić się, że obsługa dowiązań symbolicznych jest włączona, ponieważ nie jest to domyślnie.
źródło
gpedit.msc
->Local Computer Policy
->Computer Configuration
->Windows Settings
->Security Settings
->Local Policies
->User Rights Assignment
to kanoniczny sposób przypisywania praw użytkowników, takich jakSeCreateSymbolicLink
i znajomi, na całe wieki. Inne niżntrights.exe
z zestawu zasobów lub programu PowerShell ...Odpowiedź 2020
mklink
uprawnieniagit config --global core.symlinks true
Zmiana gałęzi wymusi odtworzenie brakujących dowiązań symbolicznych.
Uważaj, obsługa Symlinks w systemie Windows w przypadku niektórych innych klientów Git nie jest pełna. Zwłaszcza GitKraken.
źródło
Sugeruję, abyś nie używał dowiązań symbolicznych w repozytorium ”. Przechowuj rzeczywistą treść w repozytorium, a następnie umieść dowiązania symboliczne na zewnątrz repozytorium, które wskazują na treść.
Powiedzmy, że używasz repozytorium, aby porównać hosting swojej witryny na * nix z hostingiem na win. Przechowuj zawartość w swoim repozytorium ”, powiedzmy,
/httpRepoContent
ac:\httpRepoContent
ten folder jest synchronizowany przez GIT, SVN itp.Następnie zastąp folder zawartości serwera WWW (
/var/www
ic:\program files\web server\www
{nazwy nie mają tak naprawdę znaczenia, edytuj, jeśli musisz}) symbolicznym łączem do treści w repozytorium ”. Serwery WWW zobaczą zawartość jako „we właściwym” miejscu, ale możesz użyć kontroli źródła.Jednakże, jeśli musisz użyć dowiązań symbolicznych w repo ', musisz spojrzeć na coś w rodzaju skryptu zatwierdzania przed / po zatwierdzeniu. Wiem, że możesz ich używać do robienia rzeczy, takich jak na przykład analizowanie plików kodu za pomocą formatera, więc powinna istnieć możliwość konwersji dowiązań symbolicznych między platformami.
jeśli ktoś zna dobre miejsce, aby dowiedzieć się, jak wykonywać te skrypty dla typowych kontrolek źródłowych, SVN GIT MG, to proszę dodać komentarz.
źródło
Dla tych, którzy używają CygWin na Vista, Win7 lub nowszym, natywne
git
polecenie może tworzyć „właściwe” dowiązania symboliczne rozpoznawane przez aplikacje Windows, takie jak Android Studio . Musisz tylko ustawićCYGWIN
zmienną środowiskową, aby zawieraławinsymlinks:native
lubwinsymlinks:nativestrict
jako taka:Wadą tego (i istotną w tym przypadku) jest to, że powłoka CygWin musi być „Uruchomiona jako administrator”, aby mieć uprawnienia systemu operacyjnego wymagane do tworzenia tego rodzaju dowiązań symbolicznych. Jednak po ich utworzeniu nie są wymagane specjalne uprawnienia do korzystania z nich. O ile nie zostaną one zmienione w repozytorium przez innego programistę, od tej
git
pory będzie działać poprawnie z normalnymi uprawnieniami użytkownika.Osobiście używam tego tylko do dowiązań symbolicznych, które są nawigowane przez aplikacje Windows (tj. Nie-CygWin) z powodu tej dodatkowej trudności.
Aby uzyskać więcej informacji na temat tej opcji, zobacz to SO pytanie: Jak zrobić symboliczne łącze z cygwin w Windows 7
źródło
Oto skrypt wsadowy do konwersji dowiązań symbolicznych w repozytorium, tylko dla plików, na podstawie odpowiedzi Josha Lee. Skrypt z dodatkowym sprawdzeniem uprawnień administratora znajduje się na stronie https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .
źródło
Cały czas korzystam z łączy sym między katalogiem głównym dokumentu a katalogiem git repo. Lubię je rozdzielać. W systemie Windows używam opcji mklink / j. Wygląda na to, że skrzyżowanie pozwala gitowi zachowywać się normalnie:
>mklink /j <location(path) of link> <source of link>
na przykład:
>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts
źródło
Szukałem łatwego rozwiązania problemu z unixowymi dowiązaniami symbolicznymi w systemie Windows. Dziękujemy bardzo za powyższe aliasy Git. Istnieje jedna drobna optymalizacja, którą można wykonać w linkach rm-symlink, aby nie usuwała plików w folderze docelowym w przypadku przypadkowego uruchomienia aliasu po raz drugi. Zwróć uwagę na nowy warunek if w pętli, aby upewnić się, że plik nie jest już linkiem do katalogu przed uruchomieniem logiki.
źródło
Jedną z prostych sztuczek, których używamy, jest po prostu połączenie
git add --all
dwa razy z rzędu.Na przykład nasze wywołania skryptów zatwierdzania systemu Windows 7:
Pierwszy dodatek traktuje link jako tekst i dodaje foldery do usunięcia.
Drugi dodatek poprawnie przegląda link i cofa usunięcie poprzez przywrócenie plików.
Jest mniej elegancki niż niektóre inne proponowane rozwiązania, ale jest prostą poprawką do niektórych naszych starszych środowisk, w których dodano dowiązania symboliczne.
źródło