Saya punya ide yang tidak biasa untuk menggunakan git sebagai sistem cadangan. Jadi katakanlah saya memiliki direktori ./backup/myfiles dan saya ingin mendukungnya menggunakan git. Agar semuanya tetap bersih, saya tidak ingin memiliki direktori .git di folder myfiles, jadi saya pikir saya bisa membuat ./backup/git_repos/myfiles. Dari melihat dokumen git, saya sudah mencoba melakukan ini:
$ cd backup/myfiles
$ mkdir ../git_repos/myfiles
$ git --git-dir=../git_repos/myfiles init
Initialized empty Git repository in backup/git_repos/myfiles/
$ git --git-dir="../git_repos/myfiles/" add foo
fatal: pathspec 'foo' did not match any files
Anda dapat melihat pesan kesalahan yang saya dapatkan di sana. Apa yang saya lakukan salah?
Jawaban:
Ini akan melakukan apa yang Anda inginkan tetapi jelas akan menyedot ketika Anda harus menentukannya dengan setiap perintah git yang pernah Anda gunakan.
Anda dapat mengekspor
GIT_WORK_TREE=.
danGIT_DIR=../backup
dan Git akan mengambilnya pada setiap perintah. Itu hanya akan memungkinkan Anda untuk bekerja dalam satu repositori per shell.Saya lebih suka menyarankan symlinking direktori .git ke tempat lain, atau membuat symlink ke direktori .git dari direktori cadangan utama Anda.
sumber
Anda hanya perlu memastikan bahwa repositori tahu di mana pohon kerja berada dan sebaliknya.
Untuk membiarkan repositori tahu di mana pohon kerja berada, setel nilai konfigurasi
core.worktree
. Untuk membiarkan pohon pekerjaan tahu di mana direktori git berada, tambahkan file bernama .git (bukan folder!) Dan tambahkan baris sepertiSejak git 1.7.5 perintah init mempelajari opsi tambahan untuk ini.
Anda dapat menginisialisasi repositori terpisah yang baru dengan
Ini akan menginisialisasi repositori git di direktori yang terpisah dan menambahkan file .git di direktori saat ini, yang merupakan direktori kerja repositori baru.
Sebelumnya ke 1.7.5 Anda harus menggunakan parameter yang sedikit berbeda dan menambahkan file .git sendiri.
Untuk menginisialisasi repositori terpisah, perintah berikut menautkan work-tree dengan repositori:
Direktori Anda saat ini adalah pohon kerja dan git akan menggunakan repositori di
/path/to/repo.git
. Perintah init secara otomatis akan menetapkancore.worktree
nilai seperti yang ditentukan dengan--git-dir
parameter.Anda bahkan dapat menambahkan alias untuk ini:
Gunakan kontrol versi git pada direktori yang berfungsi hanya baca
Dengan pengetahuan di atas, Anda bahkan dapat mengatur kontrol versi git untuk direktori yang berfungsi tanpa memiliki izin menulis. Jika Anda menggunakan
--git-dir
setiap perintah git atau mengeksekusi setiap perintah dari dalam repositori (alih-alih direktori kerja), Anda dapat meninggalkan file .git dan karenanya tidak perlu membuat file apa pun di dalam direktori kerja. Lihat juga jawaban Leosumber
core.worktree
tentu saja disimpan dalam file konfigurasi folder .git, di mana file .git menunjuk ke.fatal: core.worktree and core.bare do not make sense
. Sepertinya hanya mengubah konfigurasi sehingga tidak menyelesaikan itu.The
--separate-git-dir
pilihan untukgit init
(dangit clone
) dapat digunakan untuk mencapai hal ini pada versi saya git (1.7.11.3
). Opsi memisahkan repositori git dari pohon kerja dan membuat tautan simbolis agnostik sistem berkas agnostik (dalam bentuk file bernama.git
) di akar pohon kerja. Saya pikir hasilnya identik dengan jawaban niks .sumber
init
dirinya sendiri terlihat lebih jelas dan bersihrepo.git
dibuat dengan set atribut hiden-nya. Saya kemudian mengubahnya secara manual. Apakah Anda tahu kalau ini aman?Saya merasa lebih mudah untuk membalikkan
--work-tree
dan--git-dir
direktori yang digunakan dalam jawaban niks ':Pendekatan ini memiliki dua keunggulan:
.git
file baris perintah . Anda hanya beroperasi secara normal dari dalam root repositori.Satu-satunya peringatan yang saya temui adalah bahwa alih-alih menggunakan
.gitignore
file, Anda mengeditinfo/exclude
.Anda kemudian dapat menggunakan repositori
read_only_repos/foo
sebagai remote di repositori Anda sendiri bahkan jika file asli tidak di bawah kontrol versi.sumber
Itu konvensional untuk menamai direktori yang merupakan repositori git yang memiliki pohon kerjanya di tempat yang tidak biasa dengan ekstensi '.git', seperti repositori kosong.
Jika Anda telah memberikan
--work-tree
opsi pada waktu init maka ini akan secara otomatis mengaturcore.worktree
variabel config yang berarti bahwa git akan tahu di mana menemukan pohon yang berfungsi setelah Anda menentukan direktori git.Tetapi Anda dapat mengatur variabel ini setelah fakta juga.
Setelah Anda selesai melakukannya, perintah add harus bekerja seperti yang diharapkan.
sumber
Gunakan
git
di dalam repo:Mulai sekarang, Anda dapat menggunakan
git
di dalam./backup/git_repos/myfiles
direktori, tanpa mengatur variabel lingkungan atau parameter tambahan apa pun.sumber
warning: core.bare and core.worktree do not make sense
apakah itu berarti tidak berhasil?core.bare
untukfalse
sesudahnya.Anda dapat membuat skrip "nodgit" (No Dot GIT) dengan semacamnya
Anda dapat memanggil nodgit sebagai ganti git dan itu akan mengatur variabel seperlunya dengan mencari repo git. Misalnya katakan Anda memiliki repo (telanjang) di / usr / local / gits / __ home__foo_wibbles dan Anda berada di / home / foo / wibbles / satu maka ia akan menemukan direktori kerja yang benar (/ home / foo / wibbles) dan repo .
Oh, Anda juga dapat menggunakan "shell nodgit" untuk mendapatkan shell dengan vars yang benar diatur sehingga Anda dapat menggunakan perintah git tua biasa.
sumber
Dengan asumsi
myfiles
direktori Anda sudah ada dan memiliki beberapa konten, dapatkah Anda hidup dengan ini:The
.git
direktori akan dibackup
, tidakmyfiles
.sumber
git
lacak menggunakan.gitignore
file tersebut. Jika Anda ingin menambahkan*
dan!myfiles
melakukannya, hanya direktori itu yang akan dilacak. Tetapi jika Anda ingin repo terpisah untuk direktori lain, Anda akan memiliki masalah ...Saya membuat skrip yang terlihat seperti
~ / bin / git-slash:
Itu berlebihan untuk menggunakan --git_dir = $ GIT_DIR, tetapi mengingatkan saya bahwa saya juga dapat mengatur variabel lingkungan di luar skrip.
Contoh di atas adalah untuk melacak perubahan lokal ke file sistem cygwin.
Dapat membuat satu skrip untuk proyek besar apa pun yang membutuhkan ini - tetapi / tanpa /.git adalah penggunaan utama saya.
Di atas cukup kecil untuk membuat alias shell atau fungsi, jika Anda menghilangkan redundansi.
Jika saya cukup sering melakukan ini, saya akan menghidupkan kembali ruang kerja untuk pemetaan repositori
mitra modern terdekatnya adalah pemetaan atau tampilan Perforce , mendukung checkout sebagian, serta non-colokasi ruang kerja dan repo.
sumber