Pengembang kami menggunakan campuran OS berbasis Windows dan Unix. Oleh karena itu, symlink yang dibuat pada mesin Unix menjadi masalah bagi pengembang Windows. Di windows (msysgit), symlink dikonversi ke file teks dengan path ke file yang ditunjuknya. Sebaliknya, saya ingin mengubah symlink menjadi symlink Windows yang sebenarnya.
Solusi ( diperbarui ) yang harus saya lakukan adalah:
- Tulis skrip pasca-checkout yang secara rekursif akan mencari file teks "symlink".
- Ganti dengan windows symlink (menggunakan mklink) dengan nama dan ekstensi yang sama dengan dummy "symlink"
- Abaikan symlink windows ini dengan menambahkan entri ke .git / info / exclude
Saya belum menerapkan ini, tetapi saya percaya ini adalah pendekatan yang solid untuk masalah ini.
Pertanyaan:
- Apa, jika ada, kerugian yang Anda lihat dari pendekatan ini?
- Apakah skrip pasca checkout ini bahkan dapat diterapkan? yaitu bisakah saya mencari file "symlink" dummy git secara rekursif?
- Adakah yang sudah mengerjakan skrip seperti itu?
Jawaban:
Anda dapat menemukan symlink dengan mencari file yang memiliki mode
120000
, mungkin dengan perintah ini:Setelah Anda mengganti tautan, saya sarankan menandai mereka sebagai tidak berubah dengan
git update-index --assume-unchanged
, daripada mendaftar di.git/info/exclude
.sumber
git ls-files -s | grep '^12' | cut -f2
(kolom pembatas-tab kedua; kolom lainnya dibatasi-ruang)for f in `git ls-files -s | awk '/120000/{print $4}'`; do git update-index --assume-unchanged $f; done
Saya menanyakan pertanyaan yang persis sama beberapa waktu lalu (tidak di sini, secara umum) dan akhirnya menemukan solusi yang sangat mirip dengan proposisi OP. Pertama saya akan memberikan jawaban langsung untuk pertanyaan 1 2 & 3, dan kemudian saya akan memposting solusi yang akhirnya saya gunakan.
git checkout
step , tetapi solusi di bawah ini telah cukup memenuhi kebutuhan saya sehingga script post-checkout literal tidak diperlukan.Solusinya:
Pengembang kami berada dalam situasi yang sama dengan OP: campuran Windows dan host yang mirip Unix, repositori, dan submodula dengan banyak git symlink, dan belum ada dukungan asli (dalam versi) dari MsysGit versi rilis untuk menangani symlink ini dengan cerdas pada host Windows .
Terima kasih kepada Josh Lee karena menunjukkan fakta bahwa git melakukan symlink dengan filemode khusus
120000
. Dengan informasi ini dimungkinkan untuk menambahkan beberapa alias git yang memungkinkan pembuatan dan manipulasi symlink git pada host Windows.Membuat symlink git di Windows
Penggunaan:, di
git add-symlink <source_file_or_dir> <target_symlink>
mana argumen yang terkait dengan file sumber atau direktori harus berupa path relatif ke symlink target. Anda dapat menggunakan alias ini dengan cara yang sama seperti yang biasa Anda gunakanln
.Misalnya, pohon repositori:
Dapat dibuat di Windows sebagai berikut:
Mengganti symlink git dengan sambungan hardlink NTFS +
Pemakaian:
Alias ini dapat menghapus symlink git satu-per-satu atau sekaligus sekaligus. Symlinks akan diganti dengan hardlink NTFS (dalam hal file) atau persimpangan NTFS (dalam kasus direktori). Manfaat menggunakan hardlinks + junctions atas symlink NTFS "true" adalah bahwa izin UAC yang ditinggikan tidak diperlukan untuk membuatnya.
Untuk menghapus symlink dari submodules, cukup gunakan dukungan bawaan git untuk mengulanginya:
Tapi, untuk setiap aksi drastis seperti ini, pembalikan bagus untuk dilakukan ...
Mengembalikan git symlink pada Windows
Penggunaan
git checkout-symlinks [symlink] [symlink] [...]
:, yang dibatalkangit rm-symlinks
, secara efektif mengembalikan repositori ke keadaan aslinya (kecuali untuk perubahan Anda, yang seharusnya tetap utuh).Dan untuk submodula:
Keterbatasan:
Direktori / file / symlink dengan spasi di jalurnya harus berfungsi. Tetapi tab atau baris baru? YMMV ... (Maksud saya: jangan lakukan itu, karena itu tidak akan berhasil.)
Jika Anda atau orang lain lupa
git checkout-symlinks
sebelum melakukan sesuatu dengan konsekuensi yang berpotensi meluas sepertigit add -A
, repositori lokal dapat berakhir dengan keadaan tercemar.Menggunakan "contoh repo" kami dari sebelumnya:
Aduh ...
Untuk alasan ini, senang untuk memasukkan alias ini sebagai langkah untuk melakukan untuk pengguna Windows sebelum dan sesudah membangun proyek, daripada setelah checkout atau sebelum mendorong. Tetapi setiap situasi berbeda. Alias ini telah cukup berguna bagi saya sehingga solusi pasca-checkout yang sebenarnya belum diperlukan.
Semoga itu bisa membantu!
Referensi:
http://git-scm.com/book/en/Git-Internals-Git-Objects
http://technet.microsoft.com/en-us/library/cc753194
Pembaruan Terakhir: 2019-03-13
mklink
panggilan itu, tentu saja) - tidak ada lagi Bashism !add-symlink
alias sekarang bekerja lebih seperti ln (1) dan dapat digunakan dari direktori dalam repositori, bukan hanya repositori direktori root.rm-symlink
alias (tunggal) telah digantikan olehrm-symlinks
alias (jamak), yang sekarang menerima beberapa argumen (atau tidak ada argumen sama sekali, yang menemukan semua symlink seluruh repositori, seperti sebelumnya) untuk selektif mengubah symlink git ke NTFS hardlinks + persimpangan .checkout-symlinks
alias juga telah diperbarui untuk menerima beberapa argumen (atau tidak sama sekali, == semuanya) untuk pembalikan selektif dari transformasi tersebut.Catatan Akhir: Sementara saya menguji pemuatan dan menjalankan alias ini menggunakan Bash 3.2 (dan bahkan 3.1) bagi mereka yang mungkin masih terjebak pada versi kuno untuk sejumlah alasan, perlu diketahui bahwa versi yang sudah tua ini terkenal karena parsernya bug. Jika Anda mengalami masalah saat mencoba memasang alias ini, hal pertama yang harus Anda perhatikan adalah memutakhirkan shell Anda (untuk Bash, periksa versinya dengan CTRL + X, CTRL + V). Atau, jika Anda mencoba menginstalnya dengan menempelkannya ke emulator terminal Anda, Anda mungkin lebih beruntung menyisipkannya ke dalam file dan sumbernya, misalnya sebagai
Semoga berhasil!
sumber
git add-symlink
Resep Anda sangat berharga bagi saya. Terimakasih banyak.Versi terbaru dari git scm (testet 2.11.1) memungkinkan untuk mengaktifkan tautan simbolik. Tetapi Anda harus mengkloning repositori dengan symlink lagi
git clone -c core.symlinks=true <URL>
. Anda perlu menjalankan perintah ini dengan hak administrator. Dimungkinkan juga untuk membuat symlink di Windows dengan mklink. Lihatlah wiki .sumber
tslint.json
File saya yang mereferensikan file dalam direktori induk masih berisi../tslint.json
. Sayang sekali, karena ini benar-benar tampak seperti yang termudah dari semua solusi yang diusulkan di sana.git clone -c core.symlinks=true <URL>
Dan pada Windows Anda harus menjalankannya dengan hak administrator.Seharusnya diimplementasikan dalam msysgit, tetapi ada dua kelemahan:
Saya melakukan pencarian cepat dan ada pekerjaan yang dilakukan secara aktif mengenai hal ini, lihat edisi 224 .
sumber
sehingga hal-hal telah berubah dengan GIT karena banyak jawaban ini diposting di sini adalah instruksi yang benar untuk membuat symlinks bekerja dengan benar di windows pada
AGUSTUS 2018
1. Pastikan git diinstal dengan dukungan symlink
2. Beri tahu Bash untuk membuat hardlink, bukan symlink
EDIT - (folder git) /etc/bash.bashrc
ADD TO BOTTOM -
MSYS=winsymlinks:nativestrict
3. Set git config untuk menggunakan symlink
atau
CATATAN: Saya telah mencoba menambahkan ini ke konfigurasi global git dan saat ini tidak berfungsi untuk saya, jadi saya sarankan menambahkan ini ke setiap repo ...
4. tarik repo
CATATAN: Kecuali jika Anda telah mengaktifkan mode pengembang di versi terbaru Windows 10, Anda harus menjalankan bash sebagai administrator untuk membuat symlink
5. Reset semua Symlinks (opsional) Jika Anda memiliki repo yang ada, atau menggunakan submodul, Anda mungkin menemukan bahwa symlink tidak dibuat dengan benar sehingga untuk menyegarkan semua symlink di repo Anda dapat menjalankan perintah ini.
CATATAN: ini akan mengatur ulang setiap perubahan sejak komit terakhir jadi pastikan Anda telah melakukan komit terlebih dahulu
sumber
Jawaban singkat: Mereka sekarang didukung dengan baik, jika Anda dapat mengaktifkan mode pengembang.
Dari https://blogs.windows.com/buildingapps/2016/12/02/symlinks-windows-10/
Mudah diabaikan dengan semua pengumuman lain dari "Pembaruan pencipta", tetapi jika Anda mengaktifkan Mode Pengembang, Anda dapat membuat symlink tanpa hak istimewa yang ditingkatkan. Anda mungkin harus menginstal ulang git dan memastikan dukungan symlink diaktifkan, karena tidak secara default.
sumber
gpedit.msc
->Local Computer Policy
->Computer Configuration
->Windows Settings
->Security Settings
->Local Policies
->User Rights Assignment
telah menjadi cara kanonik untuk menetapkan hak pengguna sepertiSeCreateSymbolicLink
dan teman sejak lama. Selainntrights.exe
dari Resource Kit atau PowerShell ...Jawaban 2020
mklink
izingit config --global core.symlinks true
Beralih cabang akan memaksa rekreasi symlink yang hilang.
Hati-hati, dukungan untuk Symlinks di Windows dengan beberapa klien Git lainnya tidak lengkap. Khususnya GitKraken.
sumber
Saya sarankan Anda tidak menggunakan symlink di dalam repo '. Simpan konten aktual di dalam repo 'dan kemudian letakkan symlink di luar repo' yang mengarah ke konten.
Jadi katakanlah Anda menggunakan repo 'untuk membandingkan hosting situs Anda di * nix dengan hosting saat menang. Simpan konten dalam repo Anda, katakanlah
/httpRepoContent
danc:\httpRepoContent
dengan ini menjadi folder yang disinkronkan melalui GIT, SVN dll.Kemudian, ganti folder konten server web Anda (
/var/www
danc:\program files\web server\www
{nama tidak terlalu penting, edit jika Anda harus}) dengan tautan simbolis ke konten dalam repo Anda. Server web akan melihat konten yang sebenarnya di tempat yang 'tepat', tetapi Anda bisa menggunakan kontrol sumber Anda.Namun, jika Anda perlu menggunakan symlinks dalam repo ', Anda perlu melihat sesuatu seperti semacam skrip komit pre / post. Saya tahu Anda dapat menggunakannya untuk melakukan hal-hal, seperti file kode parse melalui formatter misalnya, jadi mungkin untuk mengkonversi symlink antara platform.
jika ada yang tahu tempat yang baik untuk belajar bagaimana melakukan skrip ini untuk kontrol sumber umum, SVN GIT MG, maka silakan tambahkan komentar.
sumber
Bagi mereka yang menggunakan CygWin di Vista, Win7, atau di atas,
git
perintah asli dapat membuat symlink "tepat" yang dikenali oleh aplikasi Windows seperti Android Studio . Anda hanya perlu mengaturCYGWIN
variabel lingkungan untuk menyertakanwinsymlinks:native
atauwinsymlinks:nativestrict
seperti itu:Kelemahan dari ini (dan yang penting pada saat itu) adalah bahwa shell CygWin harus "Run as Administrator" agar dapat memiliki izin OS yang diperlukan untuk membuat symlink semacam itu. Namun begitu mereka dibuat, tidak ada izin khusus yang diperlukan untuk menggunakannya . Selama mereka tidak diubah dalam repositori oleh pengembang lain,
git
setelah itu berjalan dengan baik dengan izin pengguna normal.Secara pribadi, saya menggunakan ini hanya untuk symlink yang dinavigasi oleh aplikasi Windows (yaitu non-CygWin) karena kesulitan tambahan ini.
Untuk informasi lebih lanjut tentang opsi ini, lihat pertanyaan SO ini: Cara membuat tautan simbolis dengan cygwin di Windows 7
sumber
Berikut ini adalah kumpulan skrip untuk mengonversi symlink di repositori, hanya untuk file, berdasarkan jawaban Josh Lee. Skrip dengan beberapa pemeriksaan tambahan untuk hak administrator ada di https://gist.github.com/Quazistax/8daf09080bf54b4c7641 .
sumber
Saya menggunakan tautan sym sepanjang waktu antara direktori root dan direktori git repo saya. Saya suka memisahkan mereka. Di windows saya menggunakan opsi mklink / j. Persimpangan tampaknya membiarkan git berperilaku normal:
>mklink /j <location(path) of link> <source of link>
sebagai contoh:
>mklink /j c:\gitRepos\Posts C:\Bitnami\wamp\apache2\htdocs\Posts
sumber
Saya mencari solusi mudah untuk berurusan dengan tautan simbolik unix di windows. Terima kasih banyak untuk alias Git di atas. Ada satu optimasi kecil yang dapat dilakukan untuk rm-symlinks sehingga tidak menghapus file di folder tujuan seandainya alias dijalankan untuk kedua kalinya secara tidak sengaja. Harap perhatikan kondisi baru jika dalam loop untuk memastikan file belum menjadi tautan ke direktori sebelum logika dijalankan.
sumber
Salah satu trik sederhana yang kita gunakan adalah menelepon
git add --all
dua kali berturut-turut.Misalnya, Windows 7 kami melakukan panggilan skrip:
Tambah pertama memperlakukan tautan sebagai teks dan menambahkan folder untuk dihapus.
Penambahan kedua melintasi tautan dengan benar dan membatalkan penghapusan dengan mengembalikan file.
Ini kurang elegan daripada beberapa solusi lain yang diusulkan, tetapi ini adalah perbaikan sederhana untuk beberapa lingkungan lama kami yang ditambahkan symlink.
sumber