Saya memerlukan cap waktu file di lokal saya dan di server saya untuk disinkronkan. Ini dilakukan dengan Subversion dengan menyetel use-commit-times = true dalam konfigurasi sehingga modifikasi terakhir dari setiap file adalah saat itu dilakukan.
Setiap kali saya mengkloning repositori saya, saya ingin stempel waktu file mencerminkan kapan terakhir kali diubah di repositori jarak jauh, bukan ketika saya mengkloning repo.
Apakah ada cara untuk melakukan ini dengan git?
git annex
mungkin berguna untuk melacak gambarJawaban:
Saya tidak yakin ini sesuai untuk DVCS (seperti dalam VCS "Terdistribusi")
Diskusi besar telah terjadi pada tahun 2007 (lihat utas ini)
Dan beberapa dari jawaban Linus tidak terlalu tertarik pada ide tersebut. Ini salah satu contohnya:
(Catatan: peningkatan kecil: setelah pembayaran, stempel waktu dari file terbaru tidak lagi diubah (Git 2.2.2+, Januari 2015): "git checkout - bagaimana cara mempertahankan stempel waktu saat berpindah cabang?" .)
Jawaban panjangnya adalah:
sumber
git
adalah DVCS, untuk memanipulasi kode sumber yang akan dimasukkan ke dalam produk akhir Anda. Jika Anda menginginkan sistem distribusi, Anda tahu di mana menemukannyarsync
.Namun, jika Anda benar - benar ingin menggunakan waktu komit untuk stempel waktu saat check out, coba gunakan skrip ini dan letakkan (sebagai dapat dieksekusi) di file $ GIT_DIR / .git / hooks / post-checkout:
Namun perlu dicatat, bahwa skrip ini akan menyebabkan penundaan yang cukup besar untuk memeriksa repositori besar (di mana besar berarti file dalam jumlah besar, bukan ukuran file besar).
sumber
| head -n 1
harus dihindari karena memunculkan proses baru,-n 1
karenagit rev-list
dangit log
dapat digunakan sebagai gantinya.`...`
danfor
; lihat Mengapa Anda tidak membaca baris dengan "untuk" . Saya akan pergi untukgit ls-files -z
danwhile IFS= read -r -d ''
.git show --pretty=format:%ai --abbrev-commit "$(get_file_rev "$1")" | head -n 1
yang bisa Anda lakukangit show --pretty=format:%ai -s "$(get_file_rev "$1")"
, itu menyebabkan lebih sedikit data yang dihasilkan olehshow
perintah dan seharusnya mengurangi overhead.PEMBARUAN : Solusi saya sekarang dikemas ke dalam Debian / Ubuntu / Mint, Fedora, Gentoo dan mungkin distro lain:
https://github.com/MestreLion/git-tools#install
IMHO, tidak menyimpan cap waktu (dan metadata lain seperti izin dan kepemilikan) adalah batasan besar
git
.Alasan Linus tentang stempel waktu yang berbahaya hanya karena "membingungkan
make
" adalah timpang :make clean
cukup untuk memperbaiki masalah apa pun.Berlaku hanya untuk project yang menggunakan
make
, kebanyakan C / C ++. Ini benar-benar diperdebatkan untuk skrip seperti Python, Perl, atau dokumentasi secara umum.Hanya ada salahnya jika Anda menerapkan cap waktu. Tidak ada salahnya menyimpannya dalam repo. Menerapkannya bisa menjadi
--with-timestamps
opsi sederhana untukgit checkout
dan teman (clone
,pull
dll), sesuai kebijaksanaan pengguna .Baik Bazaar dan Mercurial menyimpan metadata. Pengguna dapat menerapkannya atau tidak saat check out. Tapi di git, karena stempel waktu asli bahkan tidak tersedia di repo, tidak ada opsi seperti itu.
Jadi, untuk keuntungan yang sangat kecil (tidak harus mengkompilasi ulang semuanya) yang spesifik untuk subset proyek,
git
karena DVCS umum lumpuh , beberapa informasi dari file hilang , dan, seperti yang dikatakan Linus, TIDAK MUDAH dilakukan sekarang. Sedih .Karena itu, bolehkah saya menawarkan 2 pendekatan?
1 - http://repo.or.cz/w/metastore.git , oleh David Härdeman. Mencoba melakukan apa yang
git
seharusnya dilakukan di tempat pertama : menyimpan metadata (tidak hanya stempel waktu) di repo saat melakukan (melalui hook pre-commit), dan menerapkannya kembali saat menarik (juga melalui hook).2 - Versi sederhana saya dari skrip yang saya gunakan sebelumnya untuk menghasilkan rilis tarball. Seperti yang disebutkan dalam jawaban lain, pendekatannya sedikit berbeda : untuk menerapkan stempel waktu setiap file dari komit terbaru tempat file dimodifikasi untuk setiap file .
Di bawah ini adalah benar-benar telanjang-tulang versi script, sebagai bukti-of-konsep, di Python 2.7. Untuk penggunaan sebenarnya, saya sangat merekomendasikan versi lengkap di atas:
Performanya cukup mengesankan, bahkan untuk proyek monster
wine
,git
atau bahkan kernel linux:sumber
git
apakah menyimpan cap waktu, dll. Itu hanya tidak mengatur cap waktu secara default. Lihat saja output darigit ls-files --debug
git ls-files
beroperasi pada direktori dan indeks kerja, jadi itu tidak berarti itu benar-benar menyimpan info itu di repo. Jika itu menyimpan, mengambil (dan menerapkan) waktu akan menjadi hal yang sepele.Saya mengambil jawaban Giel dan alih-alih menggunakan skrip hook pasca-komit, saya mengerjakannya ke dalam skrip penerapan khusus saya.
Pembaruan : Saya juga menghapus satu
| head -n
saran @ eregon berikut, dan menambahkan dukungan untuk file dengan spasi di dalamnya:sumber
--abbrev-commit
adalah berlebihan dalamgit show
perintah karena--pretty=format:%ai
sedang digunakan (komit hash bukan bagian dari output) dan| head -n 1
bisa diganti dengan menggunakan-s
bendera untukgit show
%ai
adalah tanggal penulis, format seperti ISO 8601 , untuk penggunaan ketat iso8601%aI
: git-scm.com/docs/git-showkami terpaksa menemukan solusi lain, karena kami memerlukan waktu modifikasi khusus dan bukan waktu commit, dan solusinya juga harus portabel (yaitu membuat python bekerja di instalasi git windows sebenarnya bukan tugas yang mudah) dan cepat. Ini mirip dengan solusi David Hardeman, yang saya putuskan untuk tidak digunakan karena kurangnya dokumentasi (dari repositori saya tidak bisa mendapatkan ide apa sebenarnya yang dilakukan kodenya).
Solusi ini menyimpan mtimes dalam file .mtimes di repositori git, memperbaruinya sesuai saat melakukan (hanya memilih mtimes file bertahap) dan menerapkannya saat checkout. Ia bekerja bahkan dengan versi cygwin / mingw dari git (tetapi Anda mungkin perlu menyalin beberapa file dari cygwin standar ke dalam folder git)
Solusinya terdiri dari 3 file:
pra-komitmen:
pasca-pembayaran
mtimestore - bash:
mtimestore - c ++
info lebih lanjut dapat ditemukan di sini https://github.com/kareltucek/git-mtime-extension beberapa informasi yang sudah ketinggalan zaman ada di http://www.ktweb.cz/blog/index.php?page=page&id=116
// edit - versi c ++ diperbarui:
// edit lihat github untuk versi terbaru
sumber
Skrip berikut menggabungkan saran
-n 1
danHEAD
, berfungsi di sebagian besar lingkungan non-Linux (seperti Cygwin), dan dapat dijalankan saat checkout:Dengan asumsi Anda menamai skrip di atas
/path/to/templates/hooks/post-checkout
dan / atau/path/to/templates/hooks/post-update
, Anda dapat menjalankannya pada repositori yang ada melalui:sumber
Solusi ini akan berjalan cukup cepat. Ini menetapkan waktu ke waktu pengubah dan waktu ke waktu pengarang. Ini tidak menggunakan modul jadi harus cukup portabel.
sumber
Berikut adalah versi yang dioptimalkan dari solusi shell di atas, dengan perbaikan kecil:
sumber
Berikut adalah metode dengan PHP:
Ini mirip dengan jawaban di sini:
Apa yang setara dengan use-commit-times untuk git?
itu membangun daftar file seperti jawaban itu, tetapi membangun dari
git ls-files
alih-alih hanya mencari di direktori kerja. Ini memecahkan masalah pengecualian.git
, dan juga memecahkan masalah file yang tidak terlacak. Juga, jawaban itu gagal jika komit terakhir dari file adalah komit gabungan, yang saya selesaikangit log -m
. Seperti jawaban lainnya, akan berhenti setelah semua file ditemukan, jadi tidak perlu membaca semua komit. Misalnya dengan:https://github.com/git/git
pada posting ini hanya membaca 292 komit. Juga mengabaikan file lama dari sejarah sesuai kebutuhan, dan tidak akan menyentuh file yang telah disentuh. Akhirnya tampaknya menjadi sedikit lebih cepat daripada solusi lainnya. Hasil dengan
git/git
repo:sumber
Saya melihat beberapa permintaan untuk versi Windows, jadi ini dia. Buat dua file berikut:
C: \ Program Files \ Git \ mingw64 \ share \ git-core \ templates \ hooks \ post-checkout
C: \ Program Files \ Git \ mingw64 \ share \ git-core \ templates \ hooks \ post-checkout.ps1
Ini menggunakan git whatchanged , sehingga berjalan melalui semua file dalam satu lintasan alih-alih memanggil git untuk setiap file.
sumber