Mengabaikan konten direktori yang sudah diperiksa?

227

Saya memiliki repositori git yang hanya digunakan untuk menyimpan file grafik dan suara yang digunakan dalam beberapa proyek. Mereka semua berada dalam satu direktori tanpa sub-direktori. Sekarang saya baru saja membuat skrip untuk menyalin aset-aset ini dari direktori terstruktur lain, dengan beberapa tingkat sub-direktori.

Sekarang saya hanya ingin struktur file hierarki (sumber) dilacak oleh git, dan direktori datar (target) (dengan semua file dalam satu tumpukan) harus diabaikan.

Saya telah menambahkan direktori target ke .gitignore, tetapi git masih melacak perubahan di dalamnya. Saya pikir jika saya melakukan penghapusan file lama di direktori target, git mungkin berhenti melacak konten baru (disalin oleh skrip), tetapi tidak.

Bagaimana cara membuat git melupakan direktori target?

Felixyz
sumber
Apa nama direktori dan apa yang telah Anda masukkan. Gitignore
mmmmmm
1
Namanya DirNameIrrelevant dan di .gitignore saya sudah mencoba meletakkan "DirNameIrrelevant", "DirNameIrrelevant /" dan "DirNameIrrelevant / *"
Felixyz

Jawaban:

524

Perintah ini akan menyebabkan git membuka direktori Anda dan semua file di bawahnya tanpa benar-benar menghapusnya:

git rm -r --cached <your directory>

The -rpilihan menyebabkan penghapusan semua file di bawah direktori Anda.

The --cachedpilihan menyebabkan file hanya dihapus dari indeks git, bukan copy pekerjaan Anda. Secara default git rm <file>akan menghapus <file>.

Gordon Wilson
sumber
Ah terima kasih. Sangat berguna, walaupun saya tidak melihat mengapa ini harus dilakukan (mengapa tidak cukup dengan menambahkan dir di .gitignore?). Bisakah Anda memberi tahu saya untuk apa --cached?
Felixyz
Tentu. Saya telah mengubah jawaban saya untuk menjelaskan dua opsi.
Gordon Wilson
Adapun mengapa ini perlu, saya hanya bisa berspekulasi. Saya kira pencipta menginginkan penguraian file menjadi eksplisit untuk mengurangi risiko kesalahan pengelompokan bagian penting dari proyek Anda. Saya membayangkan ada juga alasan teknis.
Gordon Wilson
15
Gitignore digunakan untuk menentukan file apa yang tidak terpantau yang akan diketahui oleh git; tidak ada kaitannya dengan file yang sudah dilacak. Jika pengguna ingin melacak file yang diabaikan, git membiarkannya. Ini bisa dilakukan menggunakan add -fatau menjadi situasi Anda. Seperti yang dikatakan Gordon, ini membuat Anda tidak sengaja menghapus banyak file - repositori adalah daftar utama, bukan gitignore. Ini juga memungkinkan Anda melacak secara manual beberapa hal yang seharusnya diabaikan oleh aturan wildcard, sesuatu yang menurut saya berguna.
Cascabel
yang -rpilihan adalah tidak "menyebabkan penghapusan semua file di bawah direktori Anda" melainkan untuk recurse melalui subdirs.
MrE
78

Jika Anda perlu memiliki file yang dilacak (check-in), tetapi tidak ingin melacak perubahan lebih lanjut dari file sambil menyimpannya di repositori lokal Anda dan juga di repositori jarak jauh, ini dapat dilakukan dengan:

git update-index --assume-unchanged path/to/file.txt

Setelah itu segala perubahan pada file ini tidak akan lagi muncul di git status.

Sendirian
sumber
1
Sementara OP mungkin telah meminta direktori, ini adalah persis apa yang saya cari - mengabaikan perubahan lebih lanjut ke satu file yang diperiksa; Terima kasih!
sdaau
1
untuk mengabaikan direktori sepenuhnya gunakan 'git update-index --assume-un dired dirName / *'. Butuh beberapa saat untuk menemukan sintaksisnya, '*' diperlukan di sini
J-Dizzle
1
Bagaimana orang membalikkan ini?
Rhys
3
@Rhys untuk membalikkannya:git update-index --no-assume-unchanged dirname/**/*
JobJob
3

Untuk subdirektori yang disebut blah/tambah ke git, kedua berikut tampaknya berfungsi untuk mengabaikan file baru di blah/. Ditambahkan ke .gitignore:

blah 
blah/*
Stef
sumber
1

TL; DR untuk membersihkan repositori git Anda dan pastikan SEMUA item yang Anda abaikan memang diabaikan:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Catatan: Anda tidak perlu menentukan direktori, dengan cara ini Anda membersihkan seluruh repo jarak jauh .

Untuk lebih lanjut baca ini

Ced
sumber
0

Tidak yakin apakah ini penting atau membuat saya orang jahat, tapi begini saja.

  1. Saya menambahkan *Generated*ke file .gitignore root
  2. Saya mengirimkan file yang ingin saya simpan sebagai GeneratedFile.Wh whatever.ext. Check in
  3. Saya membuat hook git pada checkout setelah menelepon untuk melakukan skrip PowerShell melakukan ini:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Saya merasa agak buruk tentang diri saya ... tetapi ternyata itu berhasil.

Steve
sumber
-2

Ok, tampaknya Anda harus melakukan check-in terlebih dahulu dengan direktori yang benar-benar kosong (bukan file lama atau baru), dan semua file yang ditambahkan setelahnya akan diabaikan. Jika Anda menghapus file lama, tambahkan dan yang baru sebelum melakukan, yang baru ditambahkan ke repo meskipun mereka harus diabaikan.

Setidaknya, ini berhasil untuk saya dalam situasi ini. Akan tetap bagus jika ada yang bisa memberikan lebih banyak wawasan tentang apa yang terjadi.

Felixyz
sumber
1
Versi singkat dari apa yang kami katakan di tempat lain - gitignore memengaruhi apa yang akan diketahui oleh data yang tidak terlacak oleh git. Itu tidak memengaruhi apa yang akan dilakukan dengan data yang telah Anda ceritakan (mis. Mengarahkannya untuk menambah repositori).
Cascabel
Jadi masuk akal bahwa file yang dilacak dan sekarang dihapus harus dilacak seperti itu, tetapi masih tidak masuk akal bagi saya bahwa file yang ditambahkan (jika dilakukan sebelum komit berikutnya) dilacak, sedangkan jika saya 1) abaikan, 2) hapus file, 3) komit, 4) tambahkan file baru, file baru tidak dilacak.
Felixyz