Simpan file dalam repo Git, tetapi jangan melacak perubahan

305

Saya memiliki beberapa file di situs CodeIgniter yang ingin saya miliki di repo tetapi tidak melacak perubahan apa pun pada.

Sebagai contoh, saya menyebarkan instalasi baru kerangka ini ke klien baru, saya ingin file-file berikut untuk diunduh (mereka memiliki nilai default CHANGEME) dan saya hanya perlu membuat perubahan khusus untuk klien ini (kredensial basis data, info alamat email, CSS khusus).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

Saat ini jika saya lari

git clone [email protected]:user123/myRepo.git httpdocs

dan kemudian edit file di atas, semuanya hebat. Sampai saya merilis perbaikan terbaru atau patch dan jalankan git pull. Semua perubahan saya kemudian ditimpa.

gorelatif
sumber
Anda bisa mengabaikan file kredensial / konfigurasi klien dan minta program membuat file default jika hilang ketika repo diinstal?
MatthewG

Jawaban:

618

git memiliki solusi berbeda untuk melakukan ini. Pertama-tama ubah file yang tidak ingin Anda lacak dan gunakan perintah berikut:

git update-index --assume-unchanged FILE_NAME

dan jika Anda ingin melacak perubahan lagi gunakan perintah ini:

git update-index --no-assume-unchanged FILE_NAME

dokumentasi git-update-index

nasirkhan
sumber
Saya melakukan apa yang Anda katakan tetapi status git terus memberi tahu file tersebut diubah
rraallvv
7
Ya, ini seharusnya menjadi "Jawaban yang Diterima." Bekerja untukku.
joshmcode
34
Per Junio ​​Hamano (pemelihara Git): "Diasumsikan tidak berubah tidak boleh disalahgunakan untuk mekanisme pengabaian. [...] itu bukan janji oleh Git bahwa Git akan selalu menganggap jalur ini tidak dimodifikasi --- jika Git dapat menentukan jalur yang ditandai sebagai asumsi-tidak berubah telah berubah tanpa menimbulkan biaya lstat tambahan (2), ia berhak melaporkan bahwa jalur tersebut telah dimodifikasi (sebagai akibatnya, "git commit -a" bebas untuk melakukan perubahan)." Dengan kata lain, asumsi-tidak berubah hanya untuk masalah kinerja lokal. Jika Git dapat menentukan bahwa file-file itu diubah dengan cara yang lebih ringan, itu akan.
Alejandro García Iglesias
41
Membaca info untuk itu, saya pikir --skip-worktreeopsi ini lebih cocok untuk pekerjaan ini daripada --assume-unchanged.
PJSCopeland
26
--skip-worktree memang pilihan yang lebih baik. Informasi lebih lanjut: stackoverflow.com/questions/13630849/…
Penyesuai
80

Untuk menarik jawaban dari komentar jawaban lain:

$ git update-index --skip-worktree FILENAME

Tampaknya menjadi opsi yang lebih baik daripada --assume-unchanged

Lebih banyak dapat dibaca tentang ini di sini: Git - Perbedaan Antara 'menganggap-tidak berubah' dan 'melewatkan-kerja'

Anthony
sumber
Ketika saya melakukan ini dan kemudian mencoba untuk mengubah cabang, saya mendapatkan "File pohon kerja yang tidak terlacak berikut ini akan ditimpa dengan checkout ... Silakan pindahkan atau hapus sebelum Anda beralih cabang". Ada ide yang harus dihindari?
Patrick Szalapski
Artikel yang dirujuk oleh @aexl telah dipindahkan ke compiledsuccessfully.dev/git-skip-worktree
Andrew Keeton
1
The docs mengatakan ini adalah ide yang buruk. "Pengguna sering mencoba menggunakan bit asumsi-tidak berubah dan lewati-worktree untuk memberitahu Git untuk mengabaikan perubahan pada file yang dilacak. Ini tidak berfungsi seperti yang diharapkan, karena Git mungkin masih memeriksa file pohon kerja terhadap indeks saat melakukan operasi tertentu. Secara umum, Git tidak menyediakan cara untuk mengabaikan perubahan pada file yang dilacak, sehingga solusi alternatif disarankan. "
Curtis Blackwell
58

Untuk proyek Code Igniter saya, saya menyimpan database.php.example dan config.php.example dalam repo.

Kemudian saya menambahkan config.php dan aplikasi / config / database.php ke file .gitignore .

Jadi, akhirnya, ketika saya menggunakan, saya dapat menyalin file .example (ke config.php dan database.php), menyesuaikannya, dan mereka tidak akan dilacak oleh GIT.

luar biasa
sumber
12
Solusi yang bagus, tapi saya pikir jawaban nasirkhan adalah yang terbaik.
kata
Ini bukan solusi yang baik. Jika Anda menghapus indeks git Anda, Anda akan mulai melacak perubahan saat Anda tidak bermaksud melakukannya. Lihat jawaban @nasirkhans untuk cara yang benar untuk melakukan ini.
Brian Melton-Grace - MSFT
3
Saya tidak setuju dengan kedua komentar sebelumnya. Dengan cara ini jauh lebih mudah untuk memperbarui nilai "default" tanpa harus checkout dan menyalin konfigurasi lokal Anda di tempat lain hanya untuk mengembalikannya. Juga, ini berlaku untuk semua repositori sehingga Anda tidak perlu melakukan repo-perubahan berulang.
OskarD90
1
jika ada di gitignore mengapa ia mulai melacak perubahan lagi
Shapeshifter
Memecahkan masalah OP tetapi tidak benar-benar menjawab pertanyaan.
Travis Wilson
1

Saya akan meletakkannya di .gitignorefile Anda dan menyalinnya secara manual sesuai kebutuhan.

Jadi nama file kerangka akan di git, nama file abaikan tidak akan di git (tetapi akan di. Gitignore). Dengan begitu, ketika langkah manual untuk menyalinnya ke 'aktual' dari 'templat' (mungkin lebih baik nama daripada kerangka) dilakukan, mereka langsung diabaikan.

Michael Durrant
sumber
1
tidak ada cara untuk menambahkannya ke dalam repo terlebih dahulu, dan kemudian menambahkannya ke .gitignore? Akan lebih bagus jika ada solusi untuk ini untuk memasukkan file tetapi tidak ada perubahan setelah komit tertentu atau sesuatu.
gorelative
1
@ mklauber Saya ingin menyimpannya tanpa batas hingga saya jalankan git rm <file>. Tujuannya adalah IE: file config.php. Saya ingin menyimpan file konfigurasi tetapi saya jelas tidak ingin melacak kredensial database dari klien ke klien karena mereka berbeda.
gorelative
1
Ya, saya memiliki masalah dengan file database.yml rails kami. Kami menyimpan kerangka dan kemudian menyalin dan mengubahnya.
Michael Durrant
jika saya membuat file konfigurasi "Kerangka" ini, apakah Anda akan menambahkannya ke komit awal. dan kemudian memodifikasi .gitignore untuk mengabaikan file? Akibatnya menjaga file dalam repo tetapi sebagai kerangka?
gorelative
10
Anda memiliki dua opsi ini: Tambahkan file dengan git add file1lalu edit .gitignorefile Anda . File yang dikomit akan tetap di sana dan tidak diperbarui. Atau: Anda dapat menambahkan file ke .gitignoredan kemudian menambahkannya dengan git add --force file1untuk memaksa file masuk. Anda dapat menggunakan opsi ke-2 setiap kali Anda harus menimpa file
klaustopher
1

Jawaban yang diberikan adalah menyelesaikan masalah hanya sebagian, tetapi memperkenalkan lebih banyak masalah.

Saya perlu menyimpan file "Web.Local.config". Satu-satunya solusi yang berhasil bagi saya adalah:

1. Kecualikan file dari proyek

2. Buat salinan file yang terpisah sebagai Web.LocalTemplate.config

Sekarang "Web.LocalTemplate.config" dilacak oleh Git, semua pengembang dapat menggunakannya sebagai titik awal. Namun, "Web.Local.config", tidak menjadi bagian dari proyek akan secara otomatis diabaikan.

Hrvoje Matić
sumber
Bagaimana git update-index --skip-worktree FILENAMEhanya menyelesaikan masalah Anda sebagian, atau bahkan menambahkan lebih banyak masalah ?? Ini memecahkan apa yang Anda coba lakukan. Apakah kamu sudah mencobanya?
Amir Asyraf