Tandai file sebagai "tidak dapat diubah" dengan Git

41

Saya ingin memamerkan beberapa pekerjaan saya dengan mengunggahnya ke akun GitHub saya. Namun, ada beberapa file yang berisi kata sandi, seperti koneksi basis data.

Apakah ada cara menandai file sebagai tidak sesuai dengan Git sehingga tidak dapat muncul di GitHub?

Adam Carter
sumber
1
Saran tangensial: Ini mungkin tidak berlaku di setiap platform, karena beberapa sangat menikah dengan file konfigurasi, tetapi Anda dapat mempertimbangkan mengikuti pendekatan 12faktor untuk menjaga parameter ini di lingkungan: 12factor.net/config . Artinya, memiliki kode aplikasi tidak pernah menganggap keberadaan file konfigurasi. (Berbeda dengan skrip startup swasta yang menetapkan ini, tetapi tidak pernah meninggalkan mesin lokal Anda.)
millimoose
1
Jika Anda secara tidak sengaja mengkomitnya, pastikan Anda menghapusnya dari riwayat git sepenuhnya (pertanyaan lain akan menjelaskan caranya) karena meskipun Anda menghapus dan mengabaikannya, versi lama yang dikomit akan tetap ada dalam riwayat dan dapat dilihat di Github.
curiousdannii
3
Perhatikan bahwa semua jawaban tidak benar-benar menjawab pertanyaan Anda. Mereka tidak membuat file tidak dapat dikomersialkan, mereka hanya mengkonfigurasi git sehingga mengabaikannya secara default. Tetapi jika Anda secara tidak sengaja memasukkan nama file itu ke dalam baris perintah git, Anda akhirnya dapat melakukannya meskipun cocok dengan sebuah pola .gitignore. AFAIK tidak ada cara mengatakan 100% penuh-bukti gituntuk menghindari melakukan file tertentu dalam semua kasus. Meskipun ini dapat dilihat sebagai fitur ... memungkinkan perintah eksplisit untuk mengesampingkan konfigurasi umum.
Bakuriu
Anda dapat menghapus kata sandi hardcoded dan beralih ke alternatif yang lebih aman. Setelah itu Anda dapat mengganti kata sandi Database. Kata sandi lama masih ada di dalam komit, tetapi sudah usang setelah seseorang dapat membacanya daripada Anda. Saya cukup yakin bahwa Anda tidak dapat mengubah komit setelah sudah dibangun di atasnya.
BlueWizard
3
Selain apa yang dikatakan @curiousdannii, GitHub memiliki seluruh halaman yang membahas cara menghapus data sensitif yang Anda lakukan tanpa sengaja. Antara lain, halaman ini mengatakan untuk mengubah kata sandi dan kunci yang Anda terbitkan tanpa sengaja. help.github.com/articles/remove-sensitive-data
Kevin

Jawaban:

67

Apakah ada cara menandai file sebagai tidak sesuai dengan Git sehingga tidak dapat muncul di GitHub?

Pertama, tidak ada cara untuk membuat beberapa file dan komit terlihat di repositori Git lokal Anda tetapi entah bagaimana tidak dapat dilihat di GitHub; jika Anda memiliki file yang dikomit di Git, itu akan muncul di GitHub.

Kedua, tidak ada yang sederhana dan cara praktis untuk pernah menandai file individu itu sendiri sebagai Tapi ada “uncommitable.” Jelas cara untuk mengabaikan file dalam Git repo: Dengan menambahkan file (s) -termasuk path relatif mereka jika dibutuhkan — ke .gitignorefile :

Sebuah .gitignorefile menentukan file yang sengaja dilacak yang harus diabaikan oleh Git. File yang sudah dilacak oleh Git tidak terpengaruh; lihat CATATAN di bawah untuk detailnya.

Membuat dasar .gitignorecukup mudah karena itu hanya file teks biasa. Jadi — misalnya — jika saya memiliki config.phpfile di root Anda, Anda akan melakukan ini; dengan asumsi Anda menggunakan PHP tetapi konsep ini berlaku untuk pengaturan apa pun. Saya juga menggunakan Nano sebagai editor teks saya dalam contoh ini tetapi merasa bebas untuk menggunakan editor teks apa pun yang biasanya Anda gunakan untuk ini:

nano .gitignore

Dan tambahkan saja nama file itu ke file itu:

config.php

Simpan dan sekarang Git hanya akan mengabaikan file itu.

Yang mengatakan, apa yang ingin saya lakukan untuk setup seperti ini adalah untuk menjaga sampel / contoh dikonfigurasikan dari spesifikasi sensitif dalam repositori jadi saya punya beberapa referensi tentang apa format file config adalah file bernama sesuatu seperti ini:

config.SAMPLE.php

Dengan begitu Anda tahu persis bagaimana config.phpfile harus diatur melalui config.SAMPLE.phpdan Anda dapat memastikan bahwa yang sebenarnya config.phptidak pernah disentuh oleh Git.

Juga, jika Anda berencana untuk memamerkan kode Anda, Anda perlu berharap bahwa seseorang akan mencoba untuk mengambil kode itu dan mengimplementasikannya pada sistem mereka sendiri dengan cara tertentu. Ingat, kami bukan Anda dan tanpa file konfigurasi sampel di repo Anda, orang-orang tidak akan benar-benar mengerti bagaimana menerapkan kode sendiri. Heck mereka mungkin bahkan berpikir Anda tidak kompeten karena Anda tidak memberikan contoh konfigurasi dasar.

JakeGould
sumber
11
+1 untuk jawaban yang benar dan menyarankan file konfigurasi sampel. Ada beberapa perpustakaan seperti Figaro untuk Ruby yang mendorong Anda ke arah ini. Anda harus memiliki file sampel yang dikomit dengan nilai yang mirip dengan nilai nyata sehingga orang yang melihat kode Anda tahu seperti apa seharusnya lingkungan itu. Beberapa platform, seperti Heroku, menggunakan variabel lingkungan, jadi Anda dapat mengatur konfigurasi Anda untuk sesuatu seperti database_url = Environment.DATABASE_URLdan meninggalkan komentar di atas seperti # postgres://username:password@localhost/dbname.
Chris Cirefice
@ChrisCirefice Terima kasih! Selalu mengherankan saya bahwa "alat" baru muncul yang seharusnya mengingatkan Anda tentang yang sudah jelas: Jika kode ini akan dibaca oleh manusia lain, tidak menjelaskan bagaimana konfigurasi bekerja melakukan apa sebenarnya? Terima kasih lagi.
JakeGould
27

Anda juga dapat menambahkan kait pra-komitmen untuk menerapkan pemeriksaan kewarasan. Direktori .git/hookssetiap repositori git memiliki beberapa skrip sampel.

Script yang dipanggil pre-commitdijalankan jika ada sebelum setiap commit, dan nilai pengembalian yang tidak nol membatalkan komit.

Misalnya, Anda dapat memiliki skrip sederhana seperti ini:

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

Dan jika itu filenamecocok, komit gagal.

Juho Östman
sumber
1
+1 ini adalah jawaban yang benar yang sebenarnya mencegah menambahkan & melakukan file secara eksplisit.
R ..
Memang, meskipun praktik yang disarankan bukan untuk mengandalkan pencegahan ini (yaitu, gunakan `. Gitignore sebagai gantinya).
David Z
2
@R .. Ya dan tidak. Sementara pertanyaan menyatakan, "menandai file sebagai ucommitable", semangatnya adalah "mencegah file dari komitmen." Kenyataannya membuat .gitignoreadalah praktik yang sangat umum — dan biasanya dipahami — bagi siapa pun yang menggunakan Git. Tetapi skrip pra-komit tidak benar-benar digunakan oleh sebagian besar pengguna Git. Ini membutuhkan beberapa pengetahuan tentang pengaturan dan memerlukan beberapa alasan mengapa metode seperti ini lebih disukai daripada hanya menggunakan .gitignorefile. Tetapi ini sangat berguna untuk beberapa kasus yang lebih kompleks, tetapi ini jelas sebuah konsep yang akan Anda gunakan ketika Anda benar-benar tahu Anda perlu menggunakannya.
JakeGould
2
Saya bisa melihat menggunakan ini dalam situasi di mana Anda mungkin tidak 100% mempercayai. Gitignore (Anda mungkin melakukan sesuatu yang bodoh secara tidak sengaja meminta git menambahkan file untuk dikirim). Atau mungkin orang lain mungkin mengedit file .gitignore (lagipula di bawah kontrol versi). Jika Anda benar-benar membutuhkan proses yang dapat diuji, ini adalah sesuatu yang dapat Anda kerjakan dalam proses tersebut.
Cort Ammon
@CortAmmon ini tidak selalu tentang kepercayaan. Anda dapat menambahkan beberapa informasi debug sementara dan non-publik ke kode sumber Anda yang tidak ingin Anda komit tetapi Anda tidak dapat mengabaikan file tersebut. Alih-alih, Anda ingin memeriksanya sebelum melakukan jika tidak mengandung sesuatu yang ilegal . Ini terlihat seperti solusi yang baik untuk kasus penggunaan ini. Dan sebagai metter fakta inilah bagaimana saya menemukan pertanyaan ini karena ini adalah kasus penggunaan saya.
t3chb0t
12

Apa yang dikatakan @JakeGould. Dalam beberapa kasus Anda juga dapat menggunakan bit file khusus seperti skip-worktreeatau assume-unchangedyang dapat diatur dengan cara berikut; untuk perbedaan antara keduanya, lihat jawaban Stack Overflow ini :

git update-index --assume-unchanged <file>

Yang kemudian akan menyembunyikan perubahan tambahan ke file yang sudah ada dan yang dapat Anda gunakan jika Anda benar-benar ingin file ada di sana setiap kali menarik. Tetapi saya akan menyarankan Anda untuk hanya menggunakannya jika Anda benar-benar tahu apa yang Anda lakukan.

phk
sumber
8

Gunakan kata .gitignoreseperti @JakeGould. Selain itu, beberapa info terkait:

  • .gitignoremenjaga file dari dilacak; jika sudah dilacak, gunakan git rm --cacheduntuk menghapusnya
  • file / pola $GIT_DIR/info/excludejuga akan diabaikan
  • file / pola dalam file yang ditentukan oleh core.excludesFile di pengguna ~/.gitconfigjuga diabaikan.

Lihat dokumentasi resmi Git untuk lebih jelasnya.

46and2
sumber
2

Untuk memperluas jawaban Jake dan 46: satu praktik yang sangat baik adalah memiliki ekstensi yang konsisten yang Anda gunakan untuk file tempat Anda memasukkan informasi pribadi, dan gunakan .gitignoreuntuk selalu mengecualikan file dengan ekstensi itu secara global (menggunakan .gitconfigfile seperti yang disebutkan di tempat lain untuk selalu diabaikan) untuk pengguna Anda).

Dengan begitu, Anda dapat memiliki misalnya:

/projectname/mypasswords.exc 

dan jika Anda telah dikecualikan *.excsecara global, maka Anda tahu itu tidak akan dilakukan, bahkan jika Anda lupa untuk secara individu mengecualikan file tertentu.

Joe
sumber