Bagaimana saya bisa menghapus file dari repositori Git?

1924

Saya telah menambahkan file dengan nama "file1.txt"repositori Git. Setelah itu, saya komit, menambahkan beberapa direktori yang dipanggil dir1dan dir2, dan komit pada repositori Git.

Sekarang repositori saat ini memiliki "file1.txt", dir1, dan dir2. Bagaimana saya bisa menghapus "file1.txt"tanpa mempengaruhi orang lain, suka dir1dan dir2?

webminal.org
sumber
85
git rmadalah jawaban yang tepat, tetapi ingat bahwa file tersebut akan tetap ada dalam sejarah. Jika Anda ingin menghapus file karena memiliki informasi sensitif, Anda harus melakukan sesuatu yang lebih drastis. (Mengubah sejarah, terutama untuk konten yang sudah Anda dorong, adalah tindakan drastis, dan harus dihindari jika mungkin.)
Keith Thompson
8
Catatan: pada GitHub, Anda sekarang dapat langsung menghapus file dari antarmuka web (tanpa harus mengkloning repo). Lihat jawaban saya di bawah ini .
VonC
4
@KeithThompson langkah apa yang mungkin terjadi jika saya sangat ingin melakukan itu?
lessthanl0l
5
@ lessthanl0l: stackoverflow.com/q/872565/827263
Keith Thompson
terkait help.github.com/articles/…
Trevor Boyd Smith

Jawaban:

3224

Gunakan git rm.

Jika Anda ingin menghapus file dari repositori Git dan sistem file , gunakan:

git rm file1.txt
git commit -m "remove file1.txt"

Tetapi jika Anda ingin menghapus file hanya dari repositori Git dan tidak menghapusnya dari sistem file, gunakan:

git rm --cached file1.txt
git commit -m "remove file1.txt"

Dan untuk mendorong perubahan ke repo jarak jauh

git push origin branch_name  
Greg Hewgill
sumber
93
Juga berguna: git rm -r direktori // Untuk menghapus direktori dan konten
Reg
10
Itu tidak akan menyingkirkan file itu di commit lain.
VaTo
6
@ SaulOrtega: Itu benar. Untuk menghapus file dari komit sebelumnya (mengubah riwayat masa lalu), lihat halaman bantuan GitHub pada Hapus data sensitif .
Greg Hewgill
15
Perhatikan ini juga akan menghapus file secara lokal. Jika Anda hanya ingin menghapusnya dari repo, lakukan: git rm --cached file1.txt
Weston Ganger
5
Perlu dicatat bahwa jika file itu berisi informasi sensitif (mis. Kredensial) Anda harus segera mengubah kredensial tersebut . Mengutip GitHub "Setelah Anda mendorong komit ke GitHub, Anda harus mempertimbangkan data apa pun yang ada di dalamnya untuk dikompromikan. Jika Anda melakukan kata sandi, ubahlah! Jika Anda melakukan kunci, buat yang baru."
c1moore
608

git rm file.txtmenghapus file dari repo tetapi juga menghapusnya dari sistem file lokal .

Untuk menghapus file dari repo dan tidak menghapusnya dari sistem file lokal, gunakan:
git rm --cached file.txt

Situasi tepat di bawah ini adalah di mana saya menggunakan git untuk mempertahankan kontrol versi untuk situs web bisnis saya, tetapi direktori "mickey" adalah folder tmp untuk berbagi konten pribadi dengan pengembang CAD. Ketika dia membutuhkan file-file BESAR, saya membuat direktori pribadi yang tidak terhubung dan menambahkan file-file di sana untuk diambilnya melalui browser. Lupa saya melakukan ini, saya kemudian melakukan git add -Adari direktori dasar situs web. Selanjutnya, git statusmenunjukkan file baru yang perlu dikomit. Sekarang saya perlu menghapusnya dari pelacakan git dan kontrol versi ...

Contoh output di bawah ini berasal dari apa yang baru saja terjadi pada saya, di mana saya tidak sengaja menghapus .003file. Untungnya, saya tidak peduli apa yang terjadi pada salinan lokal .003, tetapi beberapa file yang saat ini berubah adalah pembaruan yang baru saja saya buat ke situs web dan akan epik telah dihapus pada sistem file lokal! "Sistem file lokal" = situs web langsung (bukan praktik yang hebat, tetapi kenyataan) .

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

Pembaruan: Jawaban ini mendapatkan lalu lintas, jadi saya pikir saya akan menyebutkan jawaban Git saya yang lain membagikan beberapa sumber daya hebat: Halaman ini memiliki grafik yang membantu menghilangkan mitos Git bagi saya. Buku "Pro Git" sedang online dan banyak membantu saya.

Chris K
sumber
6
Anda kemudian perlu melakukan ini dengan sesuatu seperti git commit -m "Just removing file1.txt"dan kemudian, jika Anda memiliki repositori jarak jauh, dorong komit dengan sesuatu seperti git push origin master.
Larangan geoengineering
77

Pertama, jika Anda menggunakan git rm, terutama untuk banyak file, pertimbangkan wildcard apa saja yang akan diselesaikan oleh shell, bukan oleh gitperintah.

git rm -- *.anExtension
git commit -m "remove multiple files"

Tapi, jika file Anda sudah ada di GitHub, Anda bisa (sejak Juli 2013) langsung menghapusnya dari GUI web!

Cukup dengan melihat file apa pun di repositori Anda, klik ikon tempat sampah di bagian atas, dan lakukan penghapusan seperti halnya edit berbasis web lainnya.

Lalu " git pull" pada repo lokal Anda, dan itu akan menghapus file secara lokal juga.
Yang membuat jawaban ini cara (bundaran) untuk menghapus file dari git repo?
(Belum lagi bahwa file di GitHub adalah dalam "repo git")


tombol hapus

(komit akan mencerminkan penghapusan file itu):

melakukan penghapusan

Dan begitu saja, itu hilang.

Untuk bantuan dengan fitur-fitur ini, pastikan untuk membaca artikel bantuan kami tentang membuat , memindahkan , mengganti nama , dan menghapus file.

Catatan: Karena ini adalah sistem kontrol versi, Git selalu mendukung Anda jika Anda perlu memulihkan file nanti.

Kalimat terakhir berarti bahwa file yang dihapus masih merupakan bagian dari sejarah, dan Anda dapat memulihkannya dengan cukup mudah (tetapi belum melalui antarmuka web GitHub):

Lihat " Kembalikan file yang dihapus di repo Git ".

VONC
sumber
4
Anda harus menggulir ke bawah dan menekan "Komit perubahan" untuk melakukan penghapusan!
LevinsonTeknologi
1
Ini tidak berfungsi untuk file teks besar. Server mencoba membuat file seperti pada tangkapan layar dan kemudian gagal dengan kesalahan 500.
CapeCoder
9
Jawaban ini merujuk ke github, pertanyaannya adalah tentang repo git. Bukan cara menggunakan antarmuka github.
Peter Marshall
65

Ini adalah satu-satunya opsi yang berfungsi untuk saya.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Catatan: Ganti * .sql dengan nama file atau tipe file Anda. Berhati-hatilah karena ini akan melalui setiap komit dan rip tipe file ini.

SUNTING: perhatikan - setelah perintah ini Anda tidak akan bisa mendorong atau menarik - Anda akan melihat penolakan 'riwayat tidak terkait' Anda bisa menggunakan 'git push - force -u origin master' untuk mendorong atau menarik

Jason Glisson
sumber
9
Ini adalah jawaban yang bagus, tetapi perhatikan bahwa berbeda dengan jawaban lainnya, perintah ini menulis ulang riwayat komit dan menghapus semua jejak file yang cocok dengan pola. Ini sangat berguna jika Anda menemukan Anda secara tidak sengaja melakukan beberapa informasi sensitif (dan, jika perlu berhasil menggunakan - memaksa untuk menulis ulang riwayat repo jarak jauh yang telah didorong).
yoniLavi
3
Persis itulah masalah yang saya miliki dan butuh beberapa trial and error untuk memperbaikinya. Seorang pria yang bekerja dengan saya telah melakukan beberapa dump database besar ke repo kembali melalui banyak banyak komitmen. Itulah sebabnya saya menggunakan .sql dalam contoh saya. Repo saya jadi kembung dan besar sehingga github tidak akan menerima dorongan lagi.
Jason Glisson
3
Jika Anda menggunakan master jarak jauh, Anda perlu memaksakan komit dan mendorongnya dengangit push --force -u origin master
AlbertMarkovski
2
@AlbertMarkovski Maaf saya tidak spesifik. Github sebenarnya tidak akan menerima dorongan karena repo berada di luar batas ukurannya. Setidaknya beberapa GB. Mereka memotong saya dan mengirimi saya email tentang hal itu. Jadi, sayangnya, tidak ada jumlah dorongan yang akan membantu pada saat itu.
Jason Glisson
2
@ JasonGlisson Saya juga menghadapi masalah di mana video ditambahkan ke repositori secara tidak sengaja.
AlbertMarkovski
34

Selain itu, jika itu folder yang akan dihapus dan folder atau file anak berikutnya, gunakan:

git rm -r foldername
Raja
sumber
2
Ini juga menghapus folder dari lokal! Use git rm --cached -r <foldername>
Axis
24

Secara lebih umum, git helpakan membantu dengan setidaknya pertanyaan sederhana seperti ini:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index
James Polley
sumber
6
Untuk hal-hal yang lebih kompleks, saya merasa git helpbingung, tapi bagus untuk hal-hal sederhana :)
James Polley
9
Ini sebenarnya tidak terlalu bagus untuk git noobs karena "index" bukan konsep yang git noobs kenal. Saya berbicara dari pengalaman pribadi menjadi seorang git noob :) Juga, saya merasa itu jauh lebih membingungkan untuk mengatakan bahwa secara rm bertahap file untuk dihapus daripada menghapus dari indeks (meskipun masih berarti untuk noobs).
Roman Starkov
Setuju dengan romkyns: Deskripsi "Hapus file dari pohon kerja dan dari indeks" tidak terdengar bagi saya seperti itu cara untuk menghapus file dari repo. Mungkin jika aku mengerti git lebih baik. Alih-alih itu terdengar seperti Anda hanya file yang tidak dipentaskan (dan secara opsional menghapusnya dari pohon yang berfungsi - apakah itu akan memengaruhi repo?)
LarsH
14

Jika Anda ingin menghapus file dari repo, tetapi biarkan di sistem file (tidak akan dilacak):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Jika Anda ingin menghapus file dari repo dan dari sistem file maka ada dua opsi:

  1. Jika file tidak memiliki perubahan yang dipentaskan dalam indeks:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Jika file memiliki perubahan yang dipentaskan dalam indeks:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

sumber
12

git rm hanya akan menghapus file pada cabang ini mulai sekarang, tetapi file itu masih ada dalam sejarah dan git akan mengingatnya.

Cara yang tepat untuk melakukannya adalah dengan git filter-branch, seperti yang disebutkan orang lain di sini. Ini akan menulis ulang setiap komit dalam sejarah cabang untuk menghapus file itu.

Tetapi, bahkan setelah melakukan itu, git dapat mengingatnya karena bisa ada referensi padanya di reflog, remote, tag dan semacamnya.

Jika Anda ingin sepenuhnya menghapusnya dalam satu langkah, saya sarankan Anda untuk menggunakannya git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Itu mudah, lakukan saja git forget-blob file1.txt.

Ini akan menghapus setiap referensi, melakukan git filter-branch, dan akhirnya menjalankan pengumpul sampah git git gcuntuk sepenuhnya menyingkirkan file ini di repo Anda.

nachoparker
sumber
10

Cara lain jika Anda ingin menghapus file dari folder lokal Anda menggunakan perintah rm dan kemudian mendorong perubahan ke server jauh.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master
Suhaib
sumber
10

Catatan: jika Anda ingin menghapus file hanya dari git, gunakan di bawah ini:

git rm --cached file1.txt

Jika Anda ingin menghapus juga dari hard disk:

git rm file1.txt

Jika Anda ingin menghapus folder (folder tersebut mungkin berisi beberapa file), Anda harus menghapus menggunakan perintah rekursif, seperti di bawah ini:

git rm -r foldername

Jika Anda ingin menghapus folder di dalam folder lain

git rm -r parentFolder/childFolder

Kemudian, Anda bisa commitdan pushseperti biasa. Namun, jika Anda ingin memulihkan folder yang dihapus, Anda dapat mengikuti ini: memulihkan file yang dihapus dari git dimungkinkan.

Dari doc:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

PILIHAN

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

mungkin perlu melarikan diri dari mereka. Nama direktori terkemuka (misalnya dir untuk menghapus dir / file1 dan dir / file2) dapat diberikan untuk menghapus semua file dalam direktori, dan secara rekursif semua sub-direktori, tetapi ini membutuhkan opsi -r untuk diberikan secara eksplisit. -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

opsi baris perintah). --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Baca lebih lanjut tentang dokumen resmi.

Blasanka
sumber
7

Untuk menghapus file tertentu

git rm nama file

Untuk membersihkan semua file yang tidak terlacak dari direktori secara rekursif dalam satu pemotretan

git clean -fdx

Sitesh
sumber
5

Jika Anda memiliki aplikasi GitHub untuk Windows, Anda dapat menghapus file dalam 5 langkah mudah:

  • Klik Sinkronkan.
  • Klik pada direktori di mana file itu berada dan pilih versi file terbaru Anda.
  • Klik pada alat dan pilih "Buka cangkang di sini."
  • Dalam shell, ketik: "rm {filename}" dan tekan enter.
  • Komit perubahan dan sinkronisasi ulang.
kusut
sumber
5

Dalam kasus saya, saya mencoba untuk menghapus file di github setelah beberapa melakukan tetapi simpan di komputer

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

dan kemudian file ini diabaikan

OlegV
sumber
3
  1. Pertama, Hapus file dari repositori lokal.

    git rm -r File-Name

    atau, hapus file hanya dari repositori lokal tetapi dari sistem file

    git rm --Cached File-Name

  2. Kedua, Komit berubah menjadi repositori lokal.

    git commit -m "unwanted files or some inline comments"   
    
  3. Akhirnya, perbarui / dorong perubahan lokal ke repositori jarak jauh.

    git push 
    
Ajay Kumar
sumber
apakah ini akan menghapus semua yang berhubungan dengan file yang ditambahkan dan didorong secara tidak sengaja?
bapors
1

Saya mencoba banyak opsi yang disarankan dan tampaknya tidak ada yang berhasil (saya tidak akan mencantumkan berbagai masalah). Apa yang akhirnya saya lakukan, yang berhasil, sederhana dan intuitif (bagi saya) adalah:

  1. pindahkan seluruh repo lokal ke tempat lain
  2. klon repo lagi dari master ke drive lokal Anda
  3. salin kembali file / folder dari salinan asli Anda di # 1 kembali ke klon baru dari # 2
  4. pastikan bahwa file besar masalah tidak ada atau dikecualikan dalam file .gitignore
  5. lakukan git add / git commit / git push yang biasa
jacanterbury
sumber
1

Setelah Anda menghapus file dari repo dengan git rmAnda dapat menggunakan BFG Repo-Cleaner untuk sepenuhnya dan mudah menghapus file dari sejarah repo.

glisu
sumber
0

Saya memiliki file obj dan bin yang secara tidak sengaja masuk ke dalam repo yang saya tidak ingin mencemari daftar 'file yang diubah'

Setelah saya perhatikan mereka pergi ke remote, saya mengabaikan mereka dengan menambahkan ini.gitignore

/*/obj
/*/bin

Masalahnya adalah mereka sudah di remote, dan ketika mereka berubah, mereka muncul sebagai diubah dan mencemari daftar file yang diubah.

Untuk berhenti melihatnya, Anda perlu menghapus seluruh folder dari repositori jarak jauh.

Dalam prompt perintah:

  1. CD ke folder repo (mis C:\repos\MyRepo )
  2. Saya ingin menghapus SSIS \ obj. Tampaknya Anda hanya dapat menghapus di tingkat atas, jadi sekarang Anda perlu CD ke SSIS: (misC:\repos\MyRepo\SSIS )
  3. Sekarang ketik mantra sihir git rm -r -f obj
    • rm = hapus
    • -r = hapus secara rekursif
    • -f = berarti paksaan, karena Anda sungguh-sungguh
    • obj adalah folder
  4. Sekarang jalankan git commit -m "remove obj folder"

Saya mendapat pesan yang mengkhawatirkan 13 file berubah 315.222 penghapusan

Kemudian karena saya tidak ingin harus mencari garis CMD, saya pergi ke Visual Sstudio dan melakukan Sinkronisasi untuk menerapkannya ke remote

Nick. McDermaid
sumber
0

Jika Anda perlu menghapus file dari ekstensi yang ditentukan (misalnya, file yang dikompilasi), Anda dapat melakukan hal berikut untuk menghapus semuanya sekaligus:

git remove -f *.pyc
Sergi Ramón
sumber
0

Menurut dokumentasi .

git rm --cached giant_file

Ketika datang ke data sensitif — lebih baik tidak mengatakan bahwa Anda menghapus file tetapi hanya memasukkannya dalam komit yang terakhir diketahui:

0. Ubah komit terakhir

git commit --amend -CHEAD

Jika Anda ingin menghapus file dari semua riwayat git, menurut dokumentasi Anda harus melakukan hal berikut:

1. Hapus dari riwayat lokal Anda

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Jangan lupa untuk memasukkan file ini di .gitignore (Jika ini file yang tidak ingin Anda bagikan (seperti kata sandi ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Jika Anda perlu menghapus dari remote

git push origin --force --all

4. Jika Anda juga perlu menghapusnya dari rilis tag:

git push origin --force --tags
Tomas Baran
sumber
-7

Jika Anda tidak mengajukan dalam repo lokal Anda tetapi dalam git repo, maka cukup buka file dalam git repo melalui antarmuka web dan temukan tombol Hapus di sudut kanan dalam antarmuka. Klik Di Sini, Untuk melihat Opsi Hapus antarmuka

Poseidon
sumber