Apakah yang terbaik adalah skrip shell yang menggantikan symlink dengan salinan, atau adakah cara lain untuk memberitahu Git untuk mengikuti symlink?
PS: Saya tahu itu tidak terlalu aman, tetapi saya hanya ingin melakukannya dalam beberapa kasus tertentu.
Jawaban:
CATATAN: Nasihat ini sekarang kedaluwarsa sesuai komentar sejak Git 1.6.1. Git dulu berperilaku seperti ini, dan tidak lagi melakukannya.
Git secara default mencoba menyimpan symlink alih-alih mengikutinya (untuk kekompakan, dan umumnya yang diinginkan orang).
Namun, saya tidak sengaja berhasil menambahkan file di luar symlink ketika symlink adalah direktori.
Yaitu:
dengan melakukan
tampaknya berfungsi ketika saya mencobanya. Namun perilaku itu tidak diinginkan oleh saya pada saat itu, jadi saya tidak dapat memberi Anda informasi lebih dari itu.
sumber
Apa yang saya lakukan untuk menambahkan agar file dalam symlink ke Git (saya tidak menggunakan symlink tetapi):
Lakukan perintah ini di direktori yang dikelola Git.
TARGETDIRECTORY
harus dibuat sebelumSOURCEDIRECTORY
dipasang ke dalamnya.Ini berfungsi dengan baik di Linux, tetapi tidak pada OS X! Trik itu juga membantu saya dengan Subversi. Saya menggunakannya untuk memasukkan file dari akun Dropbox, tempat webdesigner melakukan tugasnya.
sumber
umount [mydir]
. (+1 untuk tip luar biasa Anda, @ user252400)Mengapa tidak membuat symlink sebaliknya? Berarti alih-alih menautkan dari repositori Git ke direktori aplikasi, tautkan sebaliknya.
Sebagai contoh, katakanlah saya sedang menyiapkan aplikasi yang diinstal
~/application
yang memerlukan file konfigurasiconfig.conf
:config.conf
repositori Git saya, misalnya di~/repos/application/config.conf
.~/application
dengan menjalankanln -s ~/repos/application/config.conf
.Pendekatan ini mungkin tidak selalu berhasil, tetapi sejauh ini berhasil bagi saya.
sumber
Gunakan tautan keras sebagai gantinya. Ini berbeda dari tautan lunak (simbolik). Semua program, termasuk
git
akan memperlakukan file sebagai file biasa. Perhatikan bahwa isi dapat dimodifikasi dengan mengubah baik sumber atau tujuan.Di macOS (sebelum 10.13 Sierra Tinggi)
Jika Anda sudah menginstal git dan Xcode, instal hardlink . Ini adalah alat mikroskopis untuk membuat tautan keras .
Untuk membuat tautan keras, cukup:
macOS pembaruan Sierra Tinggi
Ikuti https://github.com/selkhateeb/hardlink/issues/31 untuk alternatif di masa mendatang.
Di Linux dan rasa Unix lainnya
The
ln
perintah dapat membuat hard link:Di Windows (Vista, 7, 8, ...)
Seseorang menyarankan untuk menggunakan mklink membuat persimpangan pada Windows, tetapi saya belum mencobanya:
sumber
ln source destination
bekerja di OS X juga. Diuji pada El Capitan.cp -al source destination
. `-l 'berarti file tautan keras alih-alih menyalin.Ini adalah kait pra-komit yang menggantikan gumpalan symlink dalam indeks, dengan konten dari symlink tersebut.
Masukkan ini
.git/hooks/pre-commit
, dan membuatnya dapat dieksekusi:Catatan
Kami menggunakan fungsionalitas yang sesuai dengan POSIX sebanyak mungkin; Namun,
diff -a
tidak sesuai dengan POSIX, mungkin antara lain.Mungkin ada beberapa kesalahan / kesalahan dalam kode ini, meskipun agak diuji.
sumber
typechange
digit status
untuk file-file yang sebenarnya symlink meskipun git sekarang hal-hal yang mereka tidak.process_links_to_nondir
?argv[0]
yang digunakan sebagai nama-perintah untuksh
proses. (Butuh sedikit waktu untuk memikirkannya, karena saya tidak ingat apa itu βΊπ)find: missing argument to -exec'
. Mungkin diperlukan langkah demi langkah untuk mengeksekusi perintah alih-alih memipakan & menggabungkan semuanya menjadi satu baris.typechange
@DavidFraser seperti, tetapi file yang ditautkan tampaknya tidak akan dipentaskan lagi)Aktif
MacOS
(Saya punya Mojave / 10.14,git
versi 2.7.1), gunakanbindfs
.brew install bindfs
cd /path/to/git_controlled_dir
mkdir local_copy_dir
bindfs </full/path/to/source_dir> </full/path/to/local_copy_dir>
Sudah diisyaratkan oleh komentar lain, tetapi tidak jelas disediakan dalam jawaban lain. Semoga ini menghemat waktu seseorang.
sumber
Failed to resolve
...No such file or directory
kesalahan kecuali saya menggunakan nama path lengkap denganbindfs
perintah.Saya dulu menambahkan file di luar symlink untuk beberapa waktu sekarang. Ini digunakan untuk bekerja dengan baik, tanpa membuat pengaturan khusus. Karena saya memperbarui ke Git 1.6.1, ini tidak berfungsi lagi.
Anda mungkin bisa beralih ke Git 1.6.0 untuk membuat ini berfungsi. Saya harap versi Git di masa depan akan memiliki bendera untuk
git-add
memungkinkannya mengikuti symlink lagi.sumber
Saya bosan dengan setiap solusi di sini baik yang sudah usang atau membutuhkan root, jadi saya membuat solusi berbasis LD_PRELOAD (hanya Linux).
Itu menghubungkan ke internal Git, menimpa 'apakah ini symlink?' berfungsi, memungkinkan symlink untuk diperlakukan sebagai isinya. Secara default, semua tautan ke luar repo diuraikan; lihat tautan untuk detailnya.
sumber
LD_PRELOAD
untuk mengganti fungsi perpustakaan!Dengan Gitp4 (Q1 2015), ada satu kasus lain di mana Git tidak akan mengikuti symlink lagi: lihat commit e0d201b oleh Junio ββC Hamano (
gitster
) (pengelola utama Git)apply
: jangan menyentuh file di luar tautan simbolikItu berarti, dalam hal ini, pesan kesalahan tidak akan seperti generik
"%s: patch does not apply"
, tetapi yang lebih spesifik:sumber
Hmmm,
mount --bind
sepertinya tidak berhasil pada Darwin.Adakah yang punya trik itu?
[diedit]
OK, saya menemukan jawabannya di Mac OS X adalah membuat hardlink. Kecuali bahwa API itu tidak diekspos melalui
ln
, jadi Anda harus menggunakan program kecil Anda sendiri untuk melakukan ini. Berikut ini tautan ke program itu:Membuat tautan keras direktori di Mac OS X
Nikmati!
sumber
Saya menggunakan Git 1.5.4.3 dan ini mengikuti symlink yang diteruskan jika memiliki garis miring. Misalnya
sumber
fatal: 'src/' is beyond a symbolic link
Konversi dari symlink dapat bermanfaat. Tautkan dalam folder Git alih-alih symlink oleh skrip .
sumber