Saya telah mengkloning sebuah proyek yang mencakup beberapa .csproj
file. Saya tidak perlu / suka csproj
file lokal saya dilacak oleh Git (atau dibesarkan ketika membuat patch), tetapi jelas mereka dibutuhkan dalam proyek.
Saya telah menambahkan *.csproj
ke LOCAL saya.gitignore
, tetapi file-file tersebut sudah dalam repo.
Ketika saya mengetik status git, itu menunjukkan perubahan saya ke csproj
yang saya tidak tertarik melacak atau mengirimkan tambalan.
Bagaimana cara menghapus "pelacakan" file-file ini dari repo pribadi saya (tetapi simpan di sumbernya agar saya dapat menggunakannya) sehingga saya tidak melihat perubahan ketika saya melakukan status (atau membuat tambalan)?
Apakah ada cara yang benar / kanonik untuk menangani situasi ini?
.csproj
file, yang merupakan bagian penting dari proyek apa pun. Perubahan pada.csproj.user
file atau.Publish.XML
file apa pun yang benar-benar saya mengerti tidak dapat dilacak, tetapi saya tertarik mengapa Anda tidak ingin melacak.csproj
...Jawaban:
Hanya memanggil
git rm --cached
setiap file yang ingin Anda hapus dari kontrol revisi akan baik-baik saja. Selama pola abaikan lokal Anda benar, Anda tidak akan melihat file-file ini termasuk dalam output status git.Perhatikan bahwa solusi ini menghapus file-file dari repositori, sehingga semua pengembang perlu mempertahankan salinan file mereka sendiri (yang tidak direvisi).
Untuk mencegah git mendeteksi perubahan pada file-file ini, Anda juga harus menggunakan perintah ini:
Apa yang mungkin ingin Anda lakukan: (dari bawah @Ryan Taylor menjawab )
Jawaban lengkap ada di sini di URL ini: http://source.kohlerville.com/2009/02/untrack-files-in-git/
sumber
git ls-files | xargs git rm --cached
- yang akan menghapus semuanya dari indeks git di direktori tertentu tanpa menghapus file yang sebenarnya.git rm --cached -r <dir>
bekerja secara rekursif pada folder dan semua file di dalamnya.Jika Anda melakukannya
git update-index --assume-unchanged file.csproj
, git tidak akan memeriksa perubahan file.csproj secara otomatis: itu akan menghentikan mereka muncul dalam status git setiap kali Anda mengubahnya. Jadi Anda dapat menandai semua file .csproj Anda dengan cara ini - meskipun Anda harus menandai secara manual file baru yang dikirim repo hulu kepada Anda. (Jika Anda memilikinya di.gitignore
atau.git/info/exclude
, maka yang Anda buat akan diabaikan)Saya tidak sepenuhnya yakin apa file .csproj itu ... jika mereka adalah sesuatu di sepanjang baris konfigurasi IDE (mirip dengan file .liplip dan .classpath Eclipse) maka saya sarankan mereka tidak pernah menjadi sumber-kontrol di semua. Di sisi lain, jika mereka adalah bagian dari sistem build (seperti Makefiles) maka jelas mereka harus --- dan cara untuk mengambil perubahan lokal opsional (misalnya dari local.csproj a la config.mk) akan berguna : bagi build menjadi bagian global dan penggantian lokal.
sumber
.csproj
?git ls-files -v
akan menampilkan file yang diasumsikan tidak berubah dengan indikator huruf kecil (misalnya,h
bukan yang biasaH
untuk file yang di-cache).Ada 3 opsi, Anda mungkin ingin # 3
1. Ini akan menyimpan file lokal untuk Anda, tetapi akan menghapusnya untuk orang lain ketika mereka menarik.
git rm --cached <file-name>
ataugit rm -r --cached <folder-name>
2. Ini untuk optimasi, seperti folder dengan banyak file, mis. SDK yang mungkin tidak akan pernah berubah. Ia memberitahu git untuk berhenti memeriksa folder besar itu setiap kali ada perubahan, secara lokal, karena ia tidak akan memilikinya. The
assume-unchanged
indeks akan diatur ulang dan file (s) ditimpa jika ada perubahan hulu ke file / folder (ketika Anda menarik).3. Ini untuk memberi tahu git bahwa Anda menginginkan versi independen file atau folder Anda sendiri. Misalnya, Anda tidak ingin menimpa (atau menghapus) file konfigurasi produksi / pementasan.
Penting untuk diketahui bahwa
git update-index
tidak akan menyebar dengan git, dan setiap pengguna harus menjalankannya secara independen.sumber
grep
dangit ls-files
it gives me error that your local changes would be overwritten
di kedua file itu juga sehingga itu berarti tidak benar, kan?Ini adalah proses dua langkah:
Hapus pelacakan file / folder - tetapi simpan di disk - gunakan
Sekarang mereka tidak muncul sebagai "diubah" tetapi masih ditampilkan sebagai
Tambahkan ke
.gitignore
sumber
Jawaban yang diterima masih tidak berhasil untuk saya
Saya menggunakan
Temukan jawabannya dari sini
sumber
Lupa .gitignore Anda?
Jika Anda memiliki seluruh proyek secara lokal tetapi lupa untuk menambahkan Anda abaikan saja dan sekarang melacak beberapa file yang tidak perlu gunakan perintah ini untuk menghapus semuanya
pastikan Anda berada di akar proyek.
Maka Anda bisa melakukan hal yang biasa
Menambahkan
Melakukan
Dorong
Kesimpulan
Semoga ini bisa membantu orang-orang yang harus membuat perubahan
.gitignore
atau melupakan semuanya bersama-sama.sumber
Seperti yang ditunjukkan dalam jawaban lain, jawaban yang dipilih salah.
The jawaban untuk pertanyaan lain menunjukkan bahwa mungkin skip-worktree yang akan diperlukan.
sumber
--skip-worktree
digunakan untuk menyimpan file di repositori tetapi berhenti melacak perubahannya . Seperti jawaban Anda mengatakan: --skip-worktree berguna ketika Anda menginstruksikan git untuk tidak menyentuh file tertentu karena pengembang harus mengubahnya--assume-unchanged
dan--skip-worktree
memiliki efek serupa tetapi tujuannya sama sekali berbeda. Yang pertama adalah untuk mempercepat kinerja git dengan mengelabui git untuk tidak memeriksa file tertentu , sedangkan yang terakhir adalah untuk mengabaikan perubahan di masa depan pada file tertentu , yang cocok untuk runtime tetapi file penting.Untuk menghemat waktu, aturan yang Anda tambahkan ke .gitignore Anda dapat digunakan untuk menghapus banyak file / folder
git rm --cached app/**/*.xml
atau
git rm --cached -r app/widgets/yourfolder/
dll
sumber
Untuk mencegah pemantauan file oleh git
Dan untuk mengembalikannya digunakan kembali
Repo untuk merujuk kasus penggunaan serupa https://github.com/awslabs/git-secrets
sumber
Banyak orang menyarankan Anda untuk menggunakannya
git update-index --assume-unchanged
. Memang, ini mungkin solusi yang baik, tetapi hanya dalam jangka pendek.Yang mungkin ingin Anda lakukan adalah ini:
git update-index --skip-worktree
.(Opsi ketiga, yang mungkin tidak Anda inginkan adalah:.
git rm --cached
Ini akan menyimpan file lokal Anda, tetapi akan ditandai sebagai dihapus dari repositori jarak jauh.)Perbedaan antara dua opsi pertama?
assume-unchanged
adalah untuk sementara memungkinkan Anda untuk menyembunyikan modifikasi dari file. Jika Anda ingin menyembunyikan modifikasi yang dilakukan pada file, memodifikasi file, lalu checkout cabang lain, Anda harus menggunakanno-assume-unchanged
kemudian mungkin menyimpan modifikasi yang dilakukan.skip-worktree
akan mengikuti Anda apa pun cabang yang Anda checkout, dengan modifikasi Anda!Gunakan kasing
assume-unchanged
Ini mengasumsikan file ini tidak boleh dimodifikasi, dan memberi Anda output yang lebih bersih ketika melakukannya
git status
. Tetapi ketika memeriksa ke cabang lain, Anda perlu mengatur ulang bendera dan melakukan atau menyimpan perubahan sebelum itu. Jika Anda menarik dengan opsi ini diaktifkan, Anda harus menyelesaikan konflik dan git tidak akan otomatis bergabung. Ini sebenarnya hanya menyembunyikan modifikasi (git status
tidak akan menampilkan file yang ditandai kepada Anda).Saya suka menggunakannya ketika saya hanya ingin menghentikan pelacakan perubahan untuk sementara waktu + melakukan banyak file (
git commit -a
) yang terkait dengan modifikasi yang sama .Gunakan kasing
skip-worktree
Anda memiliki kelas penyiapan yang berisi parameter (misalnya, termasuk kata sandi) yang harus diubah teman Anda sesuai dengan pengaturannya.
git update-index --skip-worktree MySetupClass.java
Modifikasi yang Anda lakukan akan mengikuti Anda apa pun cabang. Peringatan: jika teman Anda juga ingin memodifikasi kelas ini, mereka harus memiliki pengaturan yang sama, jika tidak modifikasi mereka akan didorong ke repositori jarak jauh. Saat menarik, versi file yang jauh harus menimpa milik Anda.
PS: lakukan satu atau yang lain, tetapi tidak keduanya karena Anda akan memiliki efek samping yang tidak diinginkan. Jika Anda ingin mencoba bendera lain, Anda harus menonaktifkan yang terakhir terlebih dahulu.
sumber
Untuk memberi tahu Git agar tidak melacak perubahan pada file / folder lokal Anda (artinya status git tidak akan mendeteksi perubahan itu), lakukan:
Dan untuk memberi tahu Git untuk melacak perubahan ke versi lokal Anda sekali lagi (sehingga Anda dapat melakukan perubahan), lakukan:
sumber
satu jawaban baris
git update-index --assume-unchanged [path]
Gunakan ini setiap kali Anda memiliki file yang ada di repo pusat dan juga repo lokal. Anda perlu membuat perubahan dalam file itu tetapi tidak boleh dipentaskan / dikomit ke repo pusat. File ini tidak boleh ditambahkan
.gitignore
. karena perubahan baru pada file jika diperkenalkan oleh administrator sistem, pengembang senior perlu didistribusikan di antara semua repo lokal.Contoh Terbaik: file konfigurasi untuk koneksi DB . Dalam repo pusat, Anda akan memiliki semua nama pengguna, kata sandi, host, port dengan nilai-nilai server DB produksi. Tetapi di dev lokal, Anda harus menggunakan hanya server DB pengembangan lokal atau lainnya (bahwa tim Anda memiliki setup). Dalam hal ini Anda ingin membuat perubahan dalam file konfigurasi tetapi tidak boleh dilakukan untuk repo pusat.
Terbaik
sumber
Saya berasumsi bahwa Anda bertanya bagaimana menghapus SEMUA file di folder tertentu atau folder bin, Daripada memilih setiap file secara terpisah.
Anda dapat menggunakan perintah ini:
git rm -r -f /<floder-name>\*
Pastikan Anda berada di direktori induk dari direktori itu.
Perintah ini akan, secara rekursif "menghapus" semua file yang ada di folder bin / atau build /. Dengan kata delete yang saya maksud git akan berpura-pura bahwa file-file itu "dihapus" dan file-file itu tidak akan dilacak. Git benar-benar menandai file-file itu berada dalam mode hapus.
Pastikan Anda memiliki .gitignore Anda siap untuk komitmen yang akan datang.
Dokumentasi: git rm
sumber
Masalahnya mungkin disebabkan oleh urutan operasi. Jika Anda memodifikasi .gitignore terlebih dahulu, kemudian git rm --cached xxx, Anda mungkin harus terus menghadapi masalah ini.
Solusi yang benar :
Pesanan invarian!
Reload .gitignore setelah modifikasi!
sumber
Saya berasumsi bahwa Anda mencoba menghapus satu file dari git tacking. untuk itu saya akan merekomendasikan perintah di bawah ini.
git update-index --assume-tidak berubah
Ex - git update-index --assume-tidak berubah .gitignore .idea / compiler.xml
sumber
Untuk mengabaikan perubahan apa pun pada semua file (dari jenis tertentu) dalam direktori, saya harus menggabungkan beberapa pendekatan ini, jika tidak, file akan dibuat jika sebelumnya tidak ada.
Di bawah ini, "excludedir" adalah nama direktori yang saya ingin tidak melihat perubahan.
Pertama, hapus semua file baru yang ada dari cache pelacakan perubahan Anda (tanpa menghapus dari sistem file Anda).
Anda dapat melakukan hal yang sama dengannya
modified:
.renamed:
sedikit lebih rumit, karena Anda harus melihat->
sedikit postingan untuk nama file baru, dan melakukan pre->
bit seperti dijelaskan dideleted:
bawah ini.deleted:
file terbukti sedikit lebih rumit, karena Anda tampaknya tidak dapat memperbarui-indeks untuk file yang tidak ada di sistem lokalPerintah terakhir dalam daftar di atas akan menghapus file lagi dari sistem file Anda, jadi silakan abaikan itu.
Lalu, blokir perubahan pelacakan dari direktori itu
sumber
Pendekatan yang hampir bebas perintah git diberikan dalam jawaban ini :
Untuk mengabaikan file tertentu untuk setiap repo lokal :
~/.gitignore_global
, misalnya dengantouch ~/.gitignore_global
di terminal Anda.git config --global core.excludesfile ~/.gitignore_global
sekali.~/.gitignore_global
. misalnyamodules/*.H
, yang akan dianggap berada di direktori kerja Anda, yaitu$WORK_DIR/modules/*.H
.Untuk mengabaikan file tertentu untuk satu repo lokal :
.git/info/exclude
dalam repo, yaitu menulis path file / dir yang ingin Anda abaikan.git/info/exclude
. misalnyamodules/*.C
, yang akan dianggap berada di direktori kerja Anda, yaitu$WORK_DIR/modules/*.C
.sumber
Terapkan .gitignore ke masa sekarang / masa depan
Jika Anda juga perlu membersihkan file yang baru saja diabaikan dari riwayat commit cabang atau jika Anda tidak ingin file yang baru saja diabaikan dihapus dari penarikan di masa mendatang , lihat jawaban ini .
sumber
setelah pencarian yang lama, temukan cara melakukan ini. alias perintah git dalam
.gitconfig
.seperti dalam proyek studio android, sebelum cabang checkout mengembalikan file konfigurasi dan kemudian lewati itu, setelah cabang checkout menggunakansed
file konfigurasi perubahan ke konfigurasi lokal saya.checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :
sumber