Cara Git-Ignore Symlink pada Modul Magento yang dipasang oleh komposer

11

Saya menginstal modul menggunakan composer.phar.

Ini membuat file symlink di publichtml/app/code/community(misalnya) dengan target untuk vendor/themodule....

Dalam saya .gitignoresaya mengecualikan direktori vendor - tetapi tautan tentu saja masih berakhir di git.

Apakah ada cara mudah untuk secara otomatis mengecualikan tautan tersebut? (selain menambahkan semuanya secara manual ke .gitignore)

Saya harus mengatakan bahwa saya memiliki beberapa require-devmodul yang tidak boleh berakhir di server akhir - jadi memiliki tautan-tautan itu akan ada setidaknya tidak begitu baik.

Alex
sumber
1
Apakah ini juga berlaku untuk modman?
philwinkle
Dengan modman, Anda biasanya akan menggunakan submit git untuk setiap ekstensi dan cukup menambahkan symlink ke repositori. Tidak perlu mengecualikan mereka di sana, sebaliknya, itu tidak masuk akal dalam skenario penyebaran modman kebanyakan.
Vinai
1
@ philwinkle Saya baru-baru ini mulai melacak root Magento dalam repo terpisah untuk alasan keamanan (mis. dengan mudah mendeteksi file yang dimodifikasi), untuk melacak perubahan pada index.php dan Mage.php, dan untuk peningkatan Magento yang lebih mudah jadi pasti relevan untuk modman juga, IMO .
ColinM

Jawaban:

8

Yang terbaik yang saya hasilkan adalah menjalankan ini setelah komposer menginstal / memperbarui

$ find * -type l -not -exec grep -q "^{}$" .gitignore \; -print >> .gitignore

Perintah harus dijalankan di direktori root git. Ia menambahkan semua symlink ke file .gitignore yang belum ada di sana.

Vinai
sumber
ini menghasilkan path seperti ./foo/bar.. Saya pikir kita harus menghapus yang pertama .- apakah itu bekerja untuk Anda seperti itu?
Alex
Bekerja dengan baik untuk saya dengan yang terkemuka ., ya. Lain sed untuk penyelamatan:find . -type l -not -exec grep -q "{}" .gitignore \; -print | sed 's/^\.\///'
Vinai
Sebenarnya, itu merusak grep ... well, mungkin ada cara yang baik untuk membersihkan jalan setapak ...
Vinai
1
Solusi sederhana: find * .... Akan memperbarui jawaban saya.
Vinai
3

Metode ini hanya menambahkan symlink yang tidak terlacak sehingga dapat diulang tanpa menambahkan entri duplikat, symlink yang ada dalam submodul atau sebaliknya sudah diabaikan, atau symlink yang sengaja dilacak.

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    test -L "$f" && echo $f >> .gitignore;
    test -d "$f" && echo $f\* >> .gitignore;
done
Kolin
sumber
1

Solusi gabungan dari @ColinM dan @Vinai yang bekerja untuk saya

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    if test -L "$f"
    then
        test -L "$f" && echo $f >> .gitignore;
    elif test -d "$f"
    then
        find ${f%/} -type l -not -exec grep -q "^{}$" .gitignore \; -print >> .gitignore
    fi
done
martin_mageworx
sumber
Apakah Anda memperhatikan bahwa pemasang komposer terkini otomatis mengecualikan symlink?
Alex
Tentu, tetapi beberapa proyek saya tidak di bawah kendali komposer. Dan solusi yang disediakan di sini tidak hanya untuk proyek komposer tetapi untuk mengabaikan symlinks sama sekali. Semoga ini bisa membantu seseorang
martin_mageworx