Bagaimana cara melacak konten yang tidak terlacak?

159

Lihat di bawah garis padat untuk pertanyaan awal saya.

Saya memiliki folder di direktori lokal saya yang tidak terlacak. Ketika saya berlari git status, saya mendapatkan:

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Ketika saya mengetik git add vendor/plugins/open_flash_chart_2lalu mencoba git statuslagi, masih dikatakan tidak terlacak. Apa yang sedang terjadi?


Berikut ini ringkasan sederhana setengah jam terakhir saya:

  • Menemukan bahwa repo Github saya tidak melacak vendor/plugins/open_flash_chart_2plugin saya . Secara khusus, tidak ada konten dan itu menunjukkan panah hijau pada ikon folder.

  • Mencoba git submodule init

    No submodule mapping found in .gitmodules for path 'vendor/plugins/open_flash_chart_2'
    
  • Mencoba git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

    vendor/plugins/open_flash_chart_2 already exists in the index
    
  • git status

    modified: vendor/plugins/open_flash_chart_2 (untracked content)
    
  • Diburu untuk file apa pun yang bernama .gitmodulesdi direktori repositori / lokal saya tetapi tidak dapat menemukannya.

Apa yang harus saya lakukan agar submodul saya berfungsi sehingga git dapat mulai melacak dengan benar?


Ini mungkin tidak terkait (saya sertakan kalau-kalau itu membantu), tetapi setiap kali saya mengetik git commit -adaripada yang biasa git commit -m "my comments", itu memunculkan kesalahan:

E325: ATTENTION
Found a swap file by the name ".git\.COMMIT-EDITMSG.swp"
         dated: Thu Nov 11 19:45:05 2010
     file name: c:/san/project/.git/COMMIT_EDITMSG
      modified: YES
     user name: San   host name: San-PC
    process ID: 4268
While opening file ".git\COMMIT_EDITMSG"
         dated: Thu Nov 11 20:56:09 2010
  NEWER than swap file!  
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
Swap file ".git\.COMMIT_EDITMSG.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:

Saya benar-benar seorang pemula di Github dan meskipun mencoba membaca dokumentasi, saya agak bingung dengan masalah-masalah khusus ini. Terima kasih.

sscirrus
sumber
2
Saya bingung tentang beberapa hal. Satu: mengapa Anda terus mengatakan github? semua yang Anda bicarakan terdengar lokal (kecuali panah hijau - saya tidak tahu tentang itu). Apakah itu benar, atau ini pertanyaan tentang mendorong pembaruan ke github? Dua: apakah Anda benar-benar melakukan sesuatu untuk membuat plugin ini sebagai submodule? Sebuah submodule adalah repositori git dengan haknya sendiri. Anda membuatnya secara terpisah, lalu menambahkannya ke proyek super.
Cascabel
1
Hm, keluaran dari status git menunjukkan bahwa memang ada submodule di sana ... tetapi Anda benar-benar tidak memiliki file .gitmodules? Jujur saja, jika plugin ini memiliki repo sendiri, dan Anda tahu versi apa yang Anda inginkan, Anda bisa menghapus direktori itu dari proyek Anda, pastikan tidak ada entri di .gitmodules, dan lakukan pengaturan submodule: git submodule add, git submodule update --init.
Cascabel
Jefromi - Saya sebenarnya tidak menyebutkan Github lebih dari dua kali - pertama kali karena panah hijau muncul di atas gambar folder kuning di repositori Github sebenarnya untuk open_flash_chart_2. Saya akan dengan senang hati mengedit jawaban untuk membuatnya lebih jelas.
sscirrus
1
@ sscirrus: Anda harus memiliki preferensi, submodule atau tidak. Jika ini adalah hal eksternal yang tidak akan Anda kerjakan, tetapi Anda mungkin menginginkan pembaruan, itu harus merupakan submodule. Jika Anda tidak ingin mendapatkan pembaruan dari repo aslinya, dan Anda mungkin ingin meretas sendiri sumbernya, itu seharusnya bukan submodule.
Cascabel
1
Pertanyaan ini tampaknya murni tentang git submodules. Saya menghapus beberapa tag karena pertanyaan ini tidak terkait langsung dengan rails atau github, itu akan berlaku untuk semua kasus penggunaan git . Dan trackingtag tampaknya digunakan untuk topik 'pelacakan pengunjung situs web', sehingga tidak berlaku juga.
edgerunner

Jawaban:

239

Anda telah menambahkan vendor/plugins/open_flash_chart_2entri "gitlink", tetapi tidak pernah mendefinisikannya sebagai submodule. Secara efektif Anda menggunakan fitur internal yang digunakan git submodule (entri gitlink) tetapi Anda tidak menggunakan fitur submodule itu sendiri.

Anda mungkin melakukan sesuatu seperti ini:

git clone git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2
git add vendor/plugins/open_flash_chart_2

Perintah terakhir ini adalah masalahnya. Direktori vendor/plugins/open_flash_chart_2dimulai sebagai repositori independen Git. Biasanya sub-repositori seperti itu diabaikan, tetapi jika Anda memberi tahu git menambahkan untuk menambahkannya secara eksplisit, maka itu akan membuat entri gitlink yang menunjuk ke komit HEAD sub-repositori alih-alih menambahkan isi direktori. Mungkin menyenangkan jika git menambahkan menolak untuk membuat "semi-submodules".

Direktori normal direpresentasikan sebagai objek pohon di Git; objek pohon memberi nama, dan izin ke objek yang dikandungnya (biasanya objek pohon dan gumpalan lainnya — direktori dan file, masing-masing). Submodules direpresentasikan sebagai entri “gitlink”; entri gitlink hanya berisi nama objek (hash) dari komit HEAD dari submodule. “Repositori sumber” untuk komit gitlink ditentukan dalam .gitmodulesfile (dan .git/configfile setelah submodule diinisialisasi).

Apa yang Anda miliki adalah entri yang menunjuk ke komit tertentu, tanpa merekam repositori sumber untuk komit itu. Anda dapat memperbaikinya dengan membuat gitlink Anda menjadi submodule yang tepat, atau dengan menghapus gitlink dan menggantinya dengan konten “normal” (file biasa dan direktori).

Mengubahnya menjadi Submodule yang Tepat

Satu-satunya bit yang Anda lewatkan untuk didefinisikan dengan benar vendor/plugins/open_flash_chart_2sebagai submodule adalah .gitmodulesfile. Biasanya (jika Anda belum menambahkannya sebagai entri gitlink kosong), Anda hanya akan menggunakan git submodule add:

git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Seperti yang Anda temukan, ini tidak akan berfungsi jika jalur sudah ada dalam indeks. Solusinya adalah untuk menghapus entri gitlink sementara dari indeks dan kemudian menambahkan submodule:

git rm --cached vendor/plugins/open_flash_chart_2
git submodule add git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Ini akan menggunakan sub-repositori Anda yang sudah ada (yaitu tidak akan mengkloning kembali repositori sumber) dan menampilkan .gitmodulesfile yang terlihat seperti ini:

[submodule "vendor/plugins/open_flash_chart_2"]
    path = vendor/plugins/open_flash_chart_2
    url = git://github.com/korin/open_flash_chart_2_plugin.git vendor/plugins/open_flash_chart_2

Itu juga akan membuat entri serupa di repositori utama Anda .git/config(tanpa pathpengaturan).

Komit itu dan Anda akan memiliki submodule yang tepat. Ketika Anda mengkloning repositori (atau mendorong ke GitHub dan mengkloning dari sana), Anda harus dapat menginisialisasi ulang submodule via git submodule update --init.

Ganti dengan Konten Biasa

Langkah selanjutnya mengasumsikan bahwa sub-repositori Anda di vendor/plugins/open_flash_chart_2tidak memiliki riwayat lokal yang ingin Anda pertahankan (yaitu semua yang Anda pedulikan adalah pohon kerja sub-repositori saat ini, bukan riwayat).

Jika Anda memiliki riwayat lokal di sub-repositori yang Anda pedulikan, maka Anda harus membuat cadangan .gitdirektori sub-repositori sebelum menghapusnya di perintah kedua di bawah ini. (Pertimbangkan juga contoh subtit git di bawah ini yang menjaga sejarah HEAD sub-repositori).

git rm --cached vendor/plugins/open_flash_chart_2
rm -rf vendor/plugins/open_flash_chart_2/.git # BACK THIS UP FIRST unless you are sure you have no local changes in it
git add vendor/plugins/open_flash_chart_2

Kali ini ketika menambahkan direktori, ini bukan sub-repositori, jadi file-file tersebut akan ditambahkan secara normal. Sayangnya, karena kami menghapus .gitdirektori, tidak ada cara super mudah untuk menjaga hal-hal terbaru dengan repositori sumber.

Anda dapat mempertimbangkan menggunakan penggabungan subtree saja. Melakukan hal itu akan membuat Anda dengan mudah menarik perubahan dari repositori sumber sambil menjaga file "flat" di repositori Anda (tanpa submodul). Perintah subtree git pihak ketiga adalah pembungkus yang bagus di sekitar fungsionalitas penggabungan subtree.

git rm --cached vendor/plugins/open_flash_chart_2
git commit -m'converting to subtree; please stand by'
mv vendor/plugins/open_flash_chart_2 ../ofc2.local
git subtree add --prefix=vendor/plugins/open_flash_chart_2 ../ofc2.local HEAD
#rm -rf ../ofc2.local # if HEAD was the only tip with local history

Kemudian:

git remote add ofc2 git://github.com/korin/open_flash_chart_2_plugin.git
git subtree pull --prefix=vendor/plugins/open_flash_chart_2 ofc2 master

git subtree push --prefix=vendor/plugins/open_flash_chart_2 [email protected]:me/my_ofc2_fork.git changes_for_pull_request

git subtree juga memiliki --squashopsi yang memungkinkan Anda menghindari memasukkan riwayat repositori sumber ke dalam riwayat Anda, tetapi masih memungkinkan Anda melakukan perubahan hulu.

Chris Johnsen
sumber
Chris, saya baru saja mencoba rm -rf vendor/plugins/open_flash_chart_2/.gitdan mengatakan 'rm' tidak dikenali. Lalu saya mencoba git rm -rf vendor/plugins/open_flash_chart_2/.gitdan katanya fatal: pathspec 'vendor/plugins/open_flash_chart_2/.git' did not match any files(tapi saya bisa sampai di sana di windows explorer!).
sscirrus
2
Kami sedikit membahas masalah ini dalam obrolan . OP dapat menghapus .gitdir sub-repositori dan menambahkan kembali file-file dengan "datar" (opsi "Konten Biasa" pertama).
Chris Johnsen
1
Ini menyelamatkan pantat saya banyak hari yang lalu. Saya tidak sengaja menambahkan sesuatu dengan direktori .git di dalamnya ke repo git saya, dan kemudian git agak-agak mengira itu memiliki submodule, yang menyebabkan komit git svn saya panik. Saya akan mendukung Anda 3 kali jika saya bisa.
davidtbernal
Ingin menunjukkan, plugin pihak ketiga subtreetidak harus bingung dengan penggabungan subtree. Itu bukan pembungkus. Penulis berkata: P
NebulaFox
@NebulaFox: Walaupun git subtree bukan hanya pembungkus di sekitar subtree merge, ia tentu saja menggunakan teknik yang sama dengan prosedur standar "subtree merge" (yaitu git readtree --prefix=pathpenggabungan subtree: git mergedengan -s subtreeatau-Xsubtree=path ). Ini memiliki tambahan bagus "di atas", juga: --squashmode, splitperintah, dan pushdan pullpembantu.
Chris Johnsen
114

Saya hanya punya masalah yang sama. Alasannya adalah karena ada subfolder yang berisi folder ".git". Menghapusnya membuat git senang.

neoneye
sumber
Ya, ini terjadi pada saya di AndroidStudio. Repo git sudah dibuat di folder / app sementara saya mencoba membuat repo satu folder git. Terima kasih.
ZirconCode
Saya memiliki aplikasi cli sudut yang dibuat di bawah banyak folder lain dan satu folder itu memiliki folder .git: / Itu adalah masalah sebenarnya bukan barang submodule!
Pascal
ini bekerja untuk saya ... Saya telah mencoba git menambahkan berkali-kali, tetapi tidak ada yang terjadi. kemudian saya menghapus .gitfolder
Ninja
1
Tetapi bagaimana jika saya masih ingin melacak subfolder saya? Apa yang harus saya lakukan ?
cyber8200
Punya kasus yang sama. Masih ingin melacak subfolder yang sayangnya berisi juga folder .git. Setelah menghapus folder .git sufolder ini, ia tidak dilacak lagi di folder .git utama saya .... :(
sqp_125
14
  1. Saya menghapus direktori .git dari direktori baru tersebut (ini dapat membuat drama submodule. Google jika tertarik.)
  2. Saya kemudian menjalankan direktori git rm -rf --cached / the / new /
  3. Lalu saya menambahkan kembali direktori dengan git add. dari atas

URL referensi https://danielmiessler.com/blog/git-modified-untracked/#gs.W0C7X6U

pengguna2041369
sumber
6

Untuk menunjukkan apa yang harus saya gali dari obrolan Chris Johansen dengan OP (ditautkan dari balasan ke jawaban):

git add vendor/plugins/open_flash_chart_2 # akan menambahkan gitlink, konten akan tetap tidak terlacak

git add vendor/plugins/open_flash_chart_2/ # PEMBERITAHUAN SLASH !!!!

Bentuk kedua akan menambahkannya tanpa gitlink, dan konten dapat dilacak. Dir. Git dengan mudah & secara otomatis diabaikan. Chris terima kasih!

Peter Lada
sumber
5

Saya menggunakan trik yang disarankan oleh Peter Lada setiap saat, dijuluki "submodules palsu":

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

Ini sangat berguna dalam beberapa skenario (pe saya menggunakannya untuk menyimpan semua konfigurasi Emacs saya di repositori, termasuk HEAD saat ini dari semua repositori git di dalam direktori paket elpa / el-get, sehingga saya dapat dengan mudah memutar kembali / meneruskan ke yang diketahui versi yang berfungsi ketika beberapa pembaruan merusak sesuatu).

Eloici
sumber
3

http://progit.org/book/ch6-6.html

Saya pikir Anda harus membaca ini untuk belajar sedikit tentang submodule. Ini ditulis dengan baik, dan tidak butuh banyak waktu untuk membacanya.

rmk
sumber
3

Saya memiliki masalah yang sama dengan proyek besar dengan banyak submodul. Berdasarkan jawaban Chris Johnsen di sini dan VonC di sini saya membuat skrip bash pendek yang beriterasi melalui semua entri gitlink yang ada dan menambahkannya sebagai submodul yang tepat.

#!/bin/bash

# Read all submodules in current git
MODULES=`git ls-files --stage | grep 160000`

# Iterate through every submodule path
while read -r MOD; do
  # extract submodule path (split line at whitespace and take string with index 3)
  ARRIN=(${MOD})
  MODPATH=${ARRIN[3]}

  # grep module url from .git file in submodule path
  MODURL=`grep "url = " $MODPATH/.git/config`
  MODURL=${MODURL##*=}

  # echo path and url for information
  echo $MODPATH
  echo $MODURL

  # remove existing entry in submodule index
  git rm --cached $MODPATH
  # add new entry in submodule index
  git submodule add $MODURL $MODPATH
done <<< "$MODULES"

Ini memperbaikinya bagi saya, saya harap itu bisa membantu.

nicolas
sumber
2

Ini berhasil bagi saya:

git update-index --skip-worktree

Jika tidak bekerja dengan pathname, coba nama file. Beri tahu saya jika ini juga berhasil untuk Anda.

Sampai jumpa!

DarkCrazy
sumber
1

Punya masalah yang sama, tetapi tidak diselesaikan dalam diskusi ini.

Saya menekan juga masalah submodule seperti yang dijelaskan dalam pembukaan utas.

% git status          
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (untracked content)

Melihat diff saya mengenali -dirty ditambahkan ke hash: Membaca dokumen lagi, memecahkan masalah bagi saya. http://web.mit.edu/jhawk/mnt/spo/git/git-doc/user-manual.html Lihat bagian "Perangkap dengan submodula"

Alasannya adalah, ada perubahan atau konten yang tidak terlacak dalam submodule. Saya pertama kali harus masuk ke direktori submodule, lakukan "git add" + "git commit" untuk mendapatkan semua konten yang dilacak dalam submodule.

Then "git status" on the master stated
% git commit
# On branch master
# Changes not staged for commit:
#   modified:   bundle/taglist (new commits)

Sekarang KEPALA baru ini dari submodule dapat dikomit ke modul master.

nero
sumber
1

Baru-baru ini saya mengalami masalah ini saat mengerjakan proyek kontrak (dianggap rahasia). Sistem di mana saya harus menjalankan kode tidak memiliki akses internet, tentu saja untuk tujuan keamanan, dan dengan demikian menginstal dependensi, menggunakan komposer dan npm, menjadi sangat menyakitkan.

Setelah banyak pertimbangan dengan kolega saya, kami memutuskan untuk hanya menggantinya dan menyalin tempel ketergantungan kami daripada melakukan pemasangan komposer atau menginstal npm.

Ini menyebabkan kami TIDAK menambahkan vendor dan npm_modules di gitignore. Inilah saat saya mengalami masalah ini.

Changed but not updated:
modified:   vendor/plugins/open_flash_chart_2 (modified content, untracked content)

Saya googled ini sedikit dan menemukan utas bermanfaat ini di SO. Tidak terlalu banyak pro di Git, dan menjadi sedikit mabuk saat mengerjakannya, saya hanya mencari semua submodules di folder vendor

find . -name ".git"

Ini memberi saya beberapa 4-5 dependensi yang memiliki git pada mereka. Saya menghapus semua folder .git dan voila ini, itu berhasil. Saya tahu ini hack, dan bukan yang sangat culun. O Dewa SO, maafkan aku! Lain kali saya berjanji untuk membaca tentang gitlink dan mematuhi O Linus Tovalds yang perkasa.

Slearner
sumber
1

Pertanyaan ini sudah dijawab, tetapi saya pikir saya akan menambahkan pada campuran apa yang saya temukan ketika saya menerima pesan-pesan ini.

Saya memiliki repo bernama playgroundyang berisi sejumlah aplikasi kotak pasir. Saya menambahkan dua aplikasi baru dari tutorial ke playgrounddirektori dengan mengkloning repo tutorial. Hasilnya adalah hal-hal git aplikasi baru menunjuk ke repo tutorial dan bukan ke repo saya. Solusinya adalah menghapus .gitdirektori dari masing-masing direktori aplikasi, direktori mvaplikasi di luar playgrounddirektori, dan kemudian mvkembali dan berjalan git add .. Setelah itu berhasil.

Dana Scheider
sumber
1

Saya memecahkan masalah ini dengan menghapus file .git dari subfolder saya.

  1. Pertama-tama hapus file .git dari subfolder Anda
  2. Kemudian hapus subfolder Anda dari git dengan menjalankan kode ini, git rm -rf --cached your_subfolder_name
  3. Kemudian tambahkan lagi folder Anda dengan git add. perintah
MehediTCF
sumber
0

Pertama pergi ke Direktori : vendor / plugins / open_flash_chart_2 dan DELETE


KEMUDIAN :

git rm --cached vendor/plugins/open_flash_chart_2  
git add .  
git commit -m "Message"  
git push -u origin master  

git status  

KELUARAN

Pada master cabang Cabang
Anda up-to-date dengan 'asal / master'.
tidak ada komitmen, direktori kerja bersih

Program-Me-Rev
sumber