Bagaimana menemukan file yang tidak terlacak di pohon Perforce? (analog dari status svn)

87

Adakah yang memiliki skrip atau alias untuk menemukan file yang tidak terlacak (really: unadded) di pohon Perforce?

EDIT: Saya memperbarui jawaban yang diterima yang satu ini karena sepertinya P4V menambahkan dukungan untuk ini pada rilis Januari 2009.

David Joyner
sumber
11
Saya tidak dapat membayangkan mengapa alat SCM perusahaan yang paling banyak digunakan kehilangan fungsi ini. Mungkin semua pengembang mereka hanya menggunakan GUI.
sorin
3
Oh untuk menangis sekeras-kerasnya!!!! Diterima p4 statustidak hanya MENCARI file yang tidak terlacak, tetapi sebenarnya MULAI MELACAKNYA. Yaitu p4 statusbukan kueri hanya-baca, seperti yang diduga dari namanya, tetapi sebenarnya adalah perintah yang mengubah banyak hal - bukan file ruang kerja. Ini BUKAN apa yang harus dilakukan perintah status, dan BUKAN apa yang svn statusdilakukannya. Hal terdekat yang dapat saya temukan svn statusadalah p4 reconcile -na- -a untuk mengatakan "file yang harus ditambahkan", -n untuk mengatakan "tidak benar-benar mengubah apa pun". /// Saya awalnya mengatakan sesuatu yang jauh lebih kuat.
Krazy Glew
1
Saya menghidupkan kembali stackoverflow.com/questions/9642531/… , yang salah ditandai sebagai duplikat stackoverflow.com/questions/9272/… , sebagai pertanyaan baru (Apa persamaan perintah p4 dengan sesuatu seperti git / hg / bzr / svn status? (Petunjuk: tidak p4 status) , dan menjawab sendiri. Lebih baik disambut
Krazy Glew
Keduanya p4 reconciledan p4 statuslambat sekali, saat git statusselesai mengeksekusi dalam 1-3 detik.
zwcloud

Jawaban:

81

EDIT: Silakan gunakan p4 statussekarang. Tidak perlu melompati rintangan lagi. Lihat jawaban @ ColonelPanic .

Pada P4V versi Jan 2009, Anda dapat mengklik kanan folder mana pun di pohon ruang kerja Anda dan mengklik "rekonsiliasi pekerjaan offline ..."

Ini akan melakukan sedikit pemrosesan kemudian memunculkan tampilan pohon terpisah dari file yang tidak diperiksa tetapi memiliki perbedaan dari versi depot, atau tidak diperiksa sama sekali. Bahkan mungkin ada beberapa kategori lain yang dimunculkan.

Anda dapat mengklik kanan pada file dalam tampilan ini dan memeriksanya, menambahkannya, atau bahkan mengembalikannya.

Ini adalah alat yang sangat berguna yang menyelamatkan saya beberapa kali.

EDIT: ah pertanyaan yang diajukan tentang skrip secara khusus, tetapi saya akan meninggalkan jawaban ini di sini untuk berjaga-jaga.

tenpn
sumber
Menambahkan solusi PowerShell dalam pertanyaan ini: stackoverflow.com/questions/3217152/…
tenpn
Apakah ini membedakan setiap file dengan versi di repo? Saya memiliki repo yang besar dan koneksi yang lambat (saat bekerja dari rumah). Ini bisa berlangsung selamanya!
gdw2
Saya tidak berpikir ini adalah diff penuh, tetapi ini tidak cepat.
tenpn
10
Oh untuk menangis sekeras-kerasnya!!!! p4 statustidak hanya MENEMUKAN file yang tidak terlacak, tetapi juga MULAI MELACAKNYA. Yaitu p4 statusbukan kueri hanya-baca, seperti yang diduga dari namanya, tetapi sebenarnya adalah perintah yang mengubah banyak hal - bukan file ruang kerja. Ini BUKAN apa yang harus dilakukan perintah status, dan BUKAN apa yang svn statusdilakukannya. Hal terdekat yang dapat saya temukan svn statusadalah p4 reconcile -na- -a untuk mengatakan "file yang harus ditambahkan", -n untuk mengatakan "tidak benar-benar mengubah apa pun". /// Saya awalnya mengatakan sesuatu yang jauh lebih kuat.
Krazy Glew
1
p4 statuspada dasarnya adalah sinonim untuk p4 reconcile -n. Mungkin Anda berlari p4 status -Ayang merupakan sinonim dari p4 reconcile?
Samwise
50

Di linux, atau jika Anda menginstal gnu-tools di windows:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null

Ini akan menampilkan pesan kesalahan untuk setiap file yang tidak terhitung. Jika Anda ingin menangkap keluaran itu:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
Mark Harrison
sumber
1
Mengalihkan stderr ke stdout akan memungkinkan Anda melakukan pemfilteran tambahan atau operasi lainnya. Misalnya, untuk melihat daftar file Java yang dapat digulir: temukan. -type f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | kurang
Jon Nadal
2
Ini memakan waktu sangat lama di ruang kerja 60K file saya. Saya telah menulis skrip python yang melakukan pekerjaan yang sama dalam waktu kurang dari 10 detik: p5 . Ini juga mendukung .p4ignoredan dapat melihat dan secara otomatis mengedit file yang tidak terlacak / diubah / dihapus.
hamstergene
@hamstergene, sangat bagus!
Mark Harrison
Menulis skrip kecil yang melakukan persis seperti itu jika ada yang tertarik (termasuk argumen dir, argumen kedalaman maks & keluaran ke stdout).
Arnon Zilca
Terima kasih; Saya menemukan ini berguna! Perhatikan bahwa ini tidak menangani symlinks ( find . -type l), dan memberikan keluaran yang menyesatkan untuk file P4 yang ditambahkan secara paksa karena berisi karakter @atau %. Namun, file seperti itu adalah minoritas, jadi tinjauan manual dari kasus tepi ini akan berfungsi di banyak kasus.
CJBS
19

Di bawah Unix:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'

Ini akan mencetak daftar file yang tidak ditambahkan di klien Anda atau depot Perforce. Saya sudah terbiasa ! -name '*~'mengecualikan file yang diakhiri dengan ~.

ahu
sumber
12

Ahh, salah satu klasik Perforce :) Ya, sungguh menyebalkan bahwa MASIH tidak ada cara mudah untuk ini dibangun ke dalam perintah default.

Cara termudah adalah dengan menjalankan perintah untuk menemukan semua file di bawah root klien Anda, dan kemudian mencoba menambahkannya ke depot. Anda akan mendapatkan daftar perubahan dari semua file baru dan file yang sudah ada akan diabaikan.

Misalnya dir / s / b / AD | p4 -x - tambahkan

(gunakan 'find. -type f -print' dari baris perintah nix).

Jika Anda menginginkan daftar fisik (di konsol atau file) maka Anda dapat menyalurkan hasil dari sebuah diff (atau menambahkan jika Anda juga ingin mereka dalam daftar perubahan).

Jika Anda menjalankan ini dalam P4Win, Anda dapat menggunakan $ r untuk mengganti root klien dari ruang kerja saat ini.

Andrew Grant
sumber
11

Apakah ada analogi svn statusatau git status?

Ya, TAPI .

Pada Perforce versi 2012.1, ada perintah p4 statusdan di P4V 'rekonsiliasi pekerjaan offline'. Namun, keduanya sangat lambat. Untuk mengecualikan file yang tidak relevan, Anda harus menulis p4ignore.txtfile sesuai https://stackoverflow.com/a/13126496/284795

Kolonel Panik
sumber
1
Ada beberapa peningkatan kinerja p4 statussejak rilis 2012.1. Jika Anda menjauh dari p4 statuskarena masalah kinerja, mungkin ada baiknya Anda mengujinya lagi untuk melihat bagaimana perilakunya sekarang.
Bryan Pendleton
7

Saya merasa terdorong untuk menambahkan jawaban, karena jawaban yang diterima, dan beberapa yang lain, memiliki apa yang menurut saya merupakan masalah yang signifikan: mereka tidak memahami perbedaan antara perintah kueri hanya-baca, dan perintah yang membuat perubahan.

Saya tidak mengharapkan kredit apa pun untuk jawaban ini, tetapi saya berharap ini akan membantu orang lain menghindari membuang-buang waktu dan membuat kesalahan dengan mengikuti jawaban yang diterima tetapi IMHO salah.

--- + SINGKAT

Mungkin cara paling mudah untuk menemukan semua file yang tidak terlacak di ruang kerja paksa adalah p4 reconcile -na.

-a mengatakan "beri saya file yang tidak ada dalam repositori, yaitu yang harus ditambahkan".

-nmengatakan "tidak membuat perubahan" - yaitu uji coba. (Meskipun pesan mungkin mengatakan "dibuka untuk menambahkan", secara mental Anda harus menafsirkannya sebagai "akan dibuka untuk menambahkan jika tidak -n")

Mungkin cara paling nyaman untuk menemukan semua perubahan lokal yang dibuat saat offline - bukan hanya file yang mungkin perlu ditambahkan, tetapi juga file yang mungkin perlu dihapus, atau yang telah diubah tanpa dibuka untuk diedit melalui p4 edit, adalah p4 reconcile -n.

Beberapa jawaban memberikan skrip, sering kali melibatkan p4 fstat. Meskipun saya belum memverifikasi semua skrip tersebut, saya sering menggunakan skrip serupa untuk mengatasi kekurangan perintah perforce seperti p4 reconcile -n- misalnya, saya sering menemukan bahwa saya menginginkan jalur lokal daripada jalur depot Perforce atau jalur ruang kerja.

--- + PERINGATAN

p4 status BUKAN mitra untuk perintah status pada sistem kontrol versi lain.

p4 statusBUKAN kueri hanya-baca. p4 statussebenarnya menemukan jenis perubahan yang p4 reconcilesama, dan menambahkannya ke repositori. p4 statustampaknya tidak memiliki -nopsi uji coba seperti p4 reconcilehalnya.

Jika ya p4 status, lihat file dan berpikir "Oh, saya tidak membutuhkannya", Anda harus menggunakannya p4 revertjika ingin melanjutkan mengedit di ruang kerja yang sama. Atau perubahan yang p4 statusditambahkan ke set perubahan Anda akan diperiksa di lain waktu.

Tampaknya ada sedikit atau tidak ada alasan untuk menggunakan p4 statusdaripada p4 reconcile -n, kecuali untuk beberapa detail ruang kerja lokal vs nama jalur depot.

Saya hanya dapat membayangkan bahwa siapa pun yang memilih 'status' untuk perintah non-read-only memiliki perintah terbatas dalam bahasa Inggris dan alat kontrol versi lainnya.

--- + P4VGUI

Di GUI p4v, perintah rekonsiliasi menemukan perubahan lokal yang mungkin perlu ditambahkan, dihapus, atau dibuka untuk pengeditan. Untungnya itu tidak menambahkannya ke daftar perubahan secara default; tetapi Anda mungkin masih ingin berhati-hati untuk menutup jendela rekonsiliasi setelah memeriksanya, jika Anda tidak ingin melakukan perubahan.

Krazy Glew
sumber
Status p4 sepertinya tidak menambah file. tampaknya berfungsi seperti dan didokumentasikan sebagai 'rekonsiliasi -n'. apakah kamu yakin itu mengubah banyak hal?
kdubs
4

Saya menggunakan yang berikut ini di alat saya yang mencadangkan file apa pun di ruang kerja yang berbeda dari repositori (untuk Windows). Ini menangani beberapa kasus aneh yang tidak terlalu disukai Perforce, seperti sisipan kosong, bintang, persen, dan tanda pagar:

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL:

" dir / S / B / AD " mendaftar semua file di atau di bawah folder ini ( / S ) dalam format "telanjang" ( / B ) tidak termasuk direktori (/ AD ). " Sed " mengubah karakter berbahaya menjadi bentuk " % xx " (a la HTML), dan perintah " p4 have " memeriksa daftar ini (" -x- ") terhadap server yang membuang apa pun tentang file yang sebenarnya ditempatkan di repositori (" 1> NUL: "). Hasilnya adalah sekumpulan garis seperti:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.

Et voila!

Ross Patterson
sumber
Ini adalah solusi yang bagus, dan masih berfungsi dengan versi P4 2015.1
Rian Sanderson
sangat cepat! find / xargs kehabisan memori dan lambat. Ingatlah untuk menggandakan% saat menambahkan ke file .bat.
kevinf
4

Atau dari P4Win, gunakan opsi "" File Lokal tidak di Depot "di panel tampilan sebelah kiri.

Saya tidak banyak menggunakan P4V, tapi menurut saya yang setara adalah dengan memilih "Sembunyikan File Ruang Kerja Lokal" di dropdown filter pada tab tampilan Ruang Kerja.

Di P4V 2015.1 Anda akan menemukan opsi ini di bawah tombol filter seperti ini: masukkan deskripsi gambar di sini

Greg Whitfield
sumber
Sayangnya, ini hanya menampilkan file di bawah direktori saat ini :(
JP P.
2

Quick 'n Dirty: Di p4v, klik kanan folder yang dimaksud dan tambahkan semua file di bawahnya ke daftar perubahan baru. Daftar perubahan sekarang akan berisi semua file yang saat ini bukan bagian dari depot.

gdw2.dll
sumber
1

Perintah berikut menghasilkan keluaran seperti status, tetapi tidak ada yang cukup setara dengan svn statusatau git status, memberikan ringkasan satu baris dari status setiap file:

  • p4 status
  • p4 opened
  • p4 diff -ds
Rhubbarb
sumber
0

Saya tidak memiliki cukup poin reputasi untuk dikomentari, tetapi solusi Ross juga mencantumkan file yang terbuka untuk ditambahkan. Anda mungkin tidak ingin menggunakan jawabannya untuk membersihkan ruang kerja Anda.

Penggunaan berikut p4 fstat(terima kasih Mark Harrison) sebagai ganti p4 have, dan mencantumkan file yang tidak ada di depot dan tidak terbuka untuk ditambahkan.

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp"

=== Jac

Jac Goudsmit
sumber
0

Metode cepat, tapi sedikit ortodoks. Jika basis kode tidak menambahkan file baru / mengubah tampilan terlalu sering, Anda dapat membuat repositori 'git' lokal dari pembayaran Anda. Dari sinkronisasi perforce yang bersih, git init, tambahkan dan komit semua file secara lokal. Status Git cepat dan akan menampilkan file yang sebelumnya tidak dilakukan.

kevinf
sumber
0

The p4 fstatperintah memungkinkan Anda menguji apakah file ada di ruang kerja, menggabungkan dengan finduntuk mencari file untuk memeriksa seperti dalam Perl contoh berikut:

// throw the output of p4 fstat to a 'output file'
// find:
//  -type f  :-  only look at files,
//  -print0  :-  terminate strings with \0s to support filenames with spaces
// xargs:
//  Groups its input into command lines,
//  -0       :-  read input strings terminated with \0s
// p4:
//  fstat    :-  fetch workspace stat on files

my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";

// read output file
open F1, $outputFile or die "$!\n";

// iterate over all the lines in F1
while (<F1>) {
  // remove trailing whitespace
  chomp $_;

  // grep lines which has 'no such file' or 'not in client'
  if($_ =~ m/no such file/ || $_ =~ m/not in client/){

     // Remove the content after '-'
     $_=~ s/-\s.*//g;

     // below line is optional. Check ur output file for more clarity.
     $_=~ s/^.\///g;

     print "$_\n";
  }
}

close F1;

Atau Anda bisa menggunakan p4 reconcile -n -m ...

Jika 'dibuka untuk dihapus' maka itu telah dihapus dari ruang kerja. Perhatikan bahwa perintah di atas berjalan dalam mode pratinjau ( -n).

menjadi
sumber
1
Mohon jangan hanya membuang beberapa kode tanpa penjelasan apapun sebagai jawaban tetapi tambahkan penjelasan untuk membantu OP memahami kode dan mempelajari sesuatu. :)
Markus
0

Saya membutuhkan sesuatu yang dapat bekerja di Linux, Mac atau Windows. Jadi saya menulis skrip Python untuk itu. Ide dasarnya adalah melakukan iterasi melalui file dan mengeksekusi p4 fstatmasing-masing file . (tentu saja mengabaikan dependensi dan folder tmp)

Anda dapat menemukannya di sini: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

pemberian
sumber
0

Perintah ini dapat memberi Anda daftar file yang perlu ditambahkan, diedit atau dihapus:
p4 status -aed ...
Anda juga dapat menggunakannya secara terpisah
status p4 -a ...
p4 status -e ...
p4 status -d ...

Hazem Ramadan
sumber
-1

Di P4V, di bawah item menu "View" pilih "Files in Folder" yang menampilkan tab baru di panel kanan. Di ujung kanan tab ada ikon kecil yang menampilkan jendela bernama "File di Folder" dengan 2 ikon. Pilih ikon kiri yang terlihat seperti corong dan Anda akan melihat beberapa opsi. Pilih "Show items not in Depot" dan semua file di folder tersebut akan muncul. Kemudian klik kanan pada file yang ingin Anda tambahkan dan pilih "Mark for Add ...". Anda dapat memverifikasi itu ada di tab "Tertunda". Kirimkan saja seperti biasa (Ctrl + S).

Insinyur
sumber