Saya hanya ingin mendapatkan daftar file yang diubah di antara dua revisi, yang sederhana:
git diff -–name-only commit1 commit2 > /path/to/my/file
Tapi, apa yang harus saya tulis, jika saya ingin menyalin semua file yang terdaftar ke tempat lain? Dan saya perlu struktur direktori yang sama sekali identik untuk file yang disalin.
Misalnya, saya telah memodifikasi dan menambahkan file:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Saya ingin memiliki /home/changes/
semua file yang diubah dan ditambahkan:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
git format-patch
dapat melakukan ini untuk rentang komit.git diff commit1 commit2 > my.patch
dan kemudiancd other/path; patch -p1 < my.patch
. Mengapa harus dilakukan dengan salinan lengkap file? Jika itu karena Anda berpikir tambalan itu mungkin tidak berlaku, dan karena itu direktori lain tidak benar-benar dalamcommit1
keadaan, Anda benar-benar harus menyalin segala sesuatu daricommit2
negara ...Jawaban:
Coba perintah berikut, yang telah saya uji:
sumber
cp --parents
petunjuknya, saya ingin opsi itu selama bertahun-tahun dan tidak pernah tahu itu ada! .. jelas saya tidak pernah repot untuk mencarinya juga = \--parents
opsicp
tidak tersedia.IFS=$'\n'
pertama mungkin melakukannya. (Lebih disukai dalam subkulit agar tidak mengacaukan nilai IFS asli Anda.)cp: cannot stat 'git diff --name-only': No such file or directory
pada git bash di windows. Apa yang saya lakukan salah? Direktori tujuan adaBerikut ini akan berfungsi dengan baik:
Untuk menjelaskan lebih lanjut:
The
-z
dengan dengangit diff --name-only
berarti menampilkan daftar file yang dipisahkan dengan byte NUL, bukan baris baru, kalau-kalau nama file Anda memiliki karakter yang tidak biasa di dalamnya.Kata
-0
toxargs
untuk menafsirkan input standar sebagai daftar parameter yang dipisahkan oleh NUL.The
-IREPLACE
diperlukan karena secara defaultxargs
akan menambahkan parameter ke akhirrsync
perintah. Sebaliknya, itu mengatakan untuk menempatkan mereka di mana nantiREPLACE
. (Itu tip yang bagus dari jawaban Server Fault ini .)The
-a
parameter untukrsync
sarana untuk melestarikan perizinan, kepemilikan, dll jika mungkin. Cara-R
untuk menggunakan jalur relatif penuh saat membuat file di tujuan.Perbarui: jika Anda memiliki versi lama
xargs
, Anda harus menggunakan-i
opsi sebagai ganti-I
. (Yang pertama ditinggalkan dalam versi selanjutnya darifindutils
.)sumber
xargs --version
?-i
, yang sudah usang di versi kemudian - 4.1 sudah cukup lama sekarang. Saya akan memperbarui jawaban saya.-I
beberapa versi, jadi mungkin cobalah-I REPLACE
.-I
hanya didukung sejakfindutils
4.2.10, dirilis Desember 2004.--diff-filter=d
untuk mengecualikan file yang dihapus dari daftar. Kalau tidak, Anda akan mendapatkan kesalahan saat mencoba menyalinnya ke folder perubahan. Kalau tidak jawaban yang bagus. Terima kasih!Inilah satu kalimat:
Daftar file yang diubah & kemas sebagai * .zip:
Daftarkan file yang diubah terakhir berkomitmen & kemas sebagai * .zip:
sumber
sed.exe
? Saya masihzip
belum ditemukan di windows.PATH
variabel env Anda .sumber
https://stackoverflow.com/users/79061/sebastian-paaske-t%c3%b8rholm
sumber
Ini bekerja dengan sempurna.
sumber
Tidak ada
cpio
yang menyebutkan yang mudah diketik, membuat tautan keras, dan menangani spasi dalam nama file:sumber