git tidak bisa menambahkan file, melihat perubahan

4

Saya memiliki proyek yang sudah ada, digunakan untuk heroku dan di bawah kendali git. Saya secara teratur menambahkan dan melakukan kode.

Saya baru-baru ini membangun kembali komputer yang sedang saya kerjakan (OSX, 10.6) dan sekarang ketika saya memohon

git status

Saya melihat perubahan saya, tetapi ketika saya mencoba menambahkan file yang diubah untuk melakukan, saya mengerti

Dans-iMac-335:[app-name-obscured] apple$ git add public/javascripts/*
fatal: Unable to write new index file

Saya telah mengkloning proyek dari repositori heroku git, dan saya dapat menambahkan di sana. Kepemilikan file dalam dua proyek adalah sama. Apa yang menyebabkan ini? Opsi saya adalah menambahkan masing-masing file yang diubah ke versi yang baru dikloning dan merekonstruksi dengan cara itu, tetapi ada banyak perubahan, dan sepertinya ada perbaikan di sini.

Adakah yang mengalami ini, dan ada ide untuk memulai?


Chris: terima kasih atas jawaban lengkapnya.

Saya bisa menjalankan git menggunakan sudo. Tampaknya dalam pengertian itu menjadi masalah izin, meskipun direktori tersebut adalah 755, dan dimiliki oleh saya, dan file terlampir 644, lagi-lagi dimiliki oleh saya (pengguna yang sama seperti yang memiliki file proyek). Ada banyak ruang disk, dan saran bahwa direktori dapat ditulisi adalah yang baik, tetapi saya menjalankan git dari dalam direktori yang berisi proyek - apakah masih perlu membuat path lalu?

Saya tidak menemukan ktrace di sistem saya, dan saya bukan ahli manipulasi terminal, tetapi saya mencoba menjalankan dtruss. Itu tidak menunjukkan masalah, tetapi saya sadar bahwa karena saya harus menggunakan sudo untuk menjalankan dtruss, itu berarti bahwa proses pemantauan dtruss juga berjalan sebagai superuser. Bagaimanapun, pada saat itu ia dapat menambahkan item ke git, dan juga menggunakan sudo saya bisa mengkomitnya sekarang. Masalahnya adalah ketika menambahkan item baru, bukan yang dimodifikasi. Jika saya melakukan sesuatu seperti

sudo dtruss su <my_username> git add some/file/name/*

Apakah saya dapat menjalankan git sebagai nama biasa saya? Saya memikirkan hal ini setelah saya meretas cara saya untuk mendapatkan hasil yang diinginkan.

Saya bisa hidup dengan menggunakan sudo untuk operasi di mana item ditambahkan dan dikomit untuk saat ini. Yang ingin saya lakukan adalah mendapatkan repo heroku saya sesuai dengan pekerjaan saat ini: maka saya pikir saya bisa mengkloning itu, dan melihat apakah masalahnya hilang. Kalau tidak, aku akan kembali ...

omnivore
sumber
2
Apakah izin di dalam Anda benar .git direktori di root proyek Anda?
heavyd
Saya kira maksud Anda dtrace tidak dtruss ; itu dapat memberikan jejak syscall yang sama itu ktrace disediakan pada sistem yang lebih lama, tetapi saya tidak memiliki sistem 10.5 atau 10.6 untuk mengetahui opsi yang Anda perlukan untuk mendapatkan informasi dari dtrace . Berjalan sebagai root akan menyembunyikan berbagai macam masalah izin (pemeriksaan izin sering kali sepenuhnya dilewati untuk proses yang berjalan sebagai root). Anda mengatakan "direktori adalah 755"; apakah Anda berbicara tentang .git direktori atau tingkat atas pohon kerja (direktori yang berisi .git direktori)? Apakah Anda memeriksa bendera dengan ls -lo .git/index?
Chris Johnsen
Ahh, mereka mengubah bentuk opsi "tampilkan bendera" o untuk O (huruf besar oh) dalam 10,5 dan yang lebih baru. Jadi periksa dengan ls -lO .git/index.
Chris Johnsen

Jawaban:

4

Indeks biasanya disimpan di tingkat atas .git direktori repositori. Lokasinya dapat diganti dengan menggunakan variabel lingkungan GIT_INDEX_FILE (mungkin perlu diperiksa bahwa: printf '%s\n' "$GIT_INDEX_FILE" ).

Jika direktori file indeks tidak dapat ditulisi, Anda akan mendapatkan pesan kesalahan sebelumnya:

fatal: Unable to create '/path/to/.git/index.lock': Permission denied

Kami cukup yakin bahwa direktori yang berisi dapat ditulisi karena Anda tidak mendapatkan pesan kesalahan ini.

Pesan kesalahan yang Anda laporkan dikeluarkan di dekat bagian paling akhir dari aktivitas untuk git add . Sayangnya errno tidak dilaporkan oleh git add ; jika telah dilaporkan, kami mungkin dapat membuat perkiraan tentang masalah berdasarkan kesalahan yang dilaporkan.

git add menunjukkan kesalahan yang Anda laporkan jika memiliki masalah dalam menuliskan isi indeks baru (isinya ditulis ke dalam .lock file) atau ketika mencoba melakukan file kunci (ganti nama file .lock file untuk menggantikan file indeks yang ada; ini 'melakukan' transaksi file-kunci, bukan apa git melakukan tidak).

Masalah Disk Space?

Bagaimana ruang kosong pada volume yang menyimpan file indeks Anda? Mungkin hampir penuh. Saya telah dapat mereproduksi pesan kesalahan ketika indeks pada volume yang cukup ruang kosong untuk membuat .lock file tetapi tidak cukup untuk menampung seluruh konten.

Masalah "Bendera"?

Apakah ada flag yang ditetapkan pada file indeks? Pada sistem saya memiliki keduanya uchg ("Tingkat pengguna tidak berubah") atau uappnd ("Hanya pengguna-tingkat tambahkan") yang ditetapkan pada file indeks akan menyebabkan git add untuk memberikan pesan kesalahan yang sama yang Anda dapatkan. Periksa bendera dengan ls -lO pada file indeks Anda (bendera ditampilkan setelah pemilik grup dan sebelum ukuran; itu akan ditampilkan - jika tidak ada flag yang ditetapkan). Jika Anda melihat bendera, gunakan tanda chflags perintah untuk menghapusnya. Anda mungkin ingin menyelidiki bagaimana bendera sampai di sana dan apakah ada file lain memilikinya (mungkin dengan ls -lOR ).

Menggunakan ktrace

Jika tidak satu pun dari saran di atas meminta solusi, maka Anda mungkin keluar ktrace dan kdump untuk mengetahui panggilan sistem apa yang gagal segera sebelum pesan kesalahan dicetak.

ktrace git add whatever
kdump | less
: Go to the bottom. Search for the error message.
: What CALL is RETurning -1? What is the reported errno?

Ketika volume penuh, saya melihat ini:

 4728 git      CALL  write(0x9,0x116d24,0x18b0)
 4728 git      RET   write -1 errno 28 No space left on device
 4728 git      CALL  write(0x2,0xbfffcd00,0x26)
 4728 git      GIO   fd 2 wrote 38 bytes
      "fatal: Unable to write new index file
      "

Ketika saya memiliki set bendera yang tidak kompatibel, saya melihat ini:

 4742 git      CALL  rename(0x105bdd,0xbfffdfa8)
 4742 git      NAMI  ".git/index.lock"
 4742 git      NAMI  ".git/index"
 4742 git      RET   rename -1 errno 1 Operation not permitted
 4742 git      CALL  write(0x2,0xbfffcd40,0x26)
 4742 git      GIO   fd 2 wrote 38 bytes
      "fatal: Unable to write new index file
      "
Chris Johnsen
sumber