Czy możesz „zignorować” plik w Perforce?

101

Czasami używam funkcji „Uzgodnij pracę w trybie offline ...” znajdującej się w środowisku P4V IDE firmy Perforce, aby zsynchronizować wszystkie pliki, nad którymi pracowałem, będąc odłączonym od magazynu P4. Uruchamia kolejne okno, które wykonuje „Folder Diff”.

Mam pliki, których nigdy nie chcę wpisywać do kontroli źródła (takie jak te znalezione w folderze bin, takie jak biblioteki DLL, wygenerowany kod itp.) Czy istnieje sposób na odfiltrowanie tych plików / folderów, aby nie pojawiały się jako „nowe”, które mogą być dodany. Mają tendencję do zaśmiecania listy plików, którymi jestem naprawdę zainteresowany. Czy P4 ma odpowiednik funkcji „ignoruj ​​plik” Subversion?

Promień
źródło
Czy mógłbyś podać przykład wyniku CVS, abyśmy mogli zobaczyć, co masz na myśli i dlaczego podane odpowiedzi nie odpowiadają Twoim oczekiwaniom?
Greg Whitfield,
2
Na forum pomysłów firmy Perforce możesz głosować na sugestie dotyczące list ignorowanych w stylu Git p4ideax.com/ideas/15/ignore-support
Colonel Panic
Kliknij „Uzgodnij pracę offline”, odznacz „Pliki lokalne nie są w składzie”, wciśnij „Uzgodnij”. Dopóki nie dodajesz plików, jest to prawdopodobnie najszybsze obejście.
pas

Odpowiedzi:

59

Od wersji 2012.1 Perforce obsługuje P4IGNOREzmienną środowiskową. Zaktualizowałem swoją odpowiedź na to pytanie dotyczące ignorowania katalogów o wyjaśnienie, jak to działa. Wtedy zauważyłem tę odpowiedź, która jest teraz chyba zbyteczna.


Zakładając, że masz klienta o nazwie „CLIENT”, katalog o nazwie „foo” (znajdujący się w katalogu głównym projektu) i chcesz zignorować wszystkie pliki .dll w tym drzewie katalogów, możesz dodać następujące wiersze do widoku obszaru roboczego, aby wykonać to:

- // depot / foo / *. dll //CLIENT/foo/*.dll
- // depot / foo /.../*. dll //CLIENT/foo/.../*.dll

Pierwsza linia usuwa je z katalogu „foo”, a druga linia usuwa je ze wszystkich podkatalogów. Teraz, kiedy „Uzgodnij pracę w trybie offline…”, wszystkie pliki .dll zostaną przeniesione do folderów „Pliki wykluczone” na dole ekranu porównania folderów. Będą ci z drogi, ale nadal będą mogli je przeglądać i manipulować, jeśli naprawdę potrzebujesz.

Możesz również zrobić to w inny sposób, co zredukuje folder „Pliki wykluczone” do jednego, ale nie będziesz w stanie manipulować żadnym z plików, które zawiera, ponieważ ścieżka będzie uszkodzona (ale jeśli chcesz je usunąć na swój sposób, to nie ma znaczenia).

- // depot / foo ... / *. dll //CLIENT/foo.../*.dll
kruk
źródło
30
Chociaż to działa, nie jest zbyt przydatne, ponieważ będziesz musiał umieścić te linie w każdym obszarze roboczym, który kiedykolwiek utworzysz.
dgrant
6
Uwaga: to nie działa w przypadku normalnego uzgadniania pracy offline z p4v. „Wykluczone pliki” wydają się znajdować tylko w „zaawansowanym” oknie uzgadniania ...
Catskul,
6
Filtr wykluczania nie działa w Reconcile Offline Workoknie dialogowym. Działa, jeśli otworzysz go w środku, Advanced Reconcile...ale jest to bezużyteczne, ponieważ w 99,9% przypadków nie potrzebujesz lub nie chcesz korzystać z zaawansowanego okna dialogowego.
sorin
12
@raven: 1) (Przykład :) Niektóre projekty używają folderów bin / obj w każdym projekcie zamiast umieszczać je w centralnej lokalizacji. (Wniosek ogólny :) Założenie Perforce, że wszystkie pliki pośrednie są umieszczane w łatwo wykluczonym miejscu obszaru roboczego, jest niepotrzebnie restrykcyjnym projektem dla tworzonego systemu VCS. 2) Niektóre projekty obejmują lokalną pamięć podręczną i / lub inne pliki generowane przez użytkownika w strukturze katalogów (na przykład pamięć podręczna * .ncb IntelliSense). Brak możliwości wykluczenia ich jako wspólnej zasady poważnie osłabia funkcje Uzgodnij pracę offline i Różne foldery.
Sam Harwell,
6
Ten szczególny problem mnie zabija.
Warren P
47

Tak ale.

Perforce w wersji 2012.1 dodał funkcję znaną jako p4ignore , zainspirowaną Git. Jednak programiści Perforce wprowadzili zmianę w zachowaniu bez uzasadnienia, co sprawia, że ​​funkcja jest znacznie mniej użyteczna.

Podczas gdy Git pobiera reguły ze wszystkich .gitignoreplików, Perforce nie wie, gdzie szukać, dopóki nie określisz nazwy pliku w zmiennej środowiskowej P4IGNORE. Ta wolność jest przekleństwem. Nie możesz włamać się do dwóch repozytoriów, które używają różnych nazw dla swoich plików ignorujących.

Ponadto funkcja ignorowania Perforce nie działa prawidłowo. Możesz to skonfigurować wystarczająco łatwo dla siebie, ale inni nie skorzystają na tym, chyba że wyraźnie się zgodzą. Kontrybutor, który tego nie zrobił, może przypadkowo przesłać niepożądane pliki (np. binFolder utworzony przez skrypt budowania).

Funkcja ignorowania w Git jest świetna, ponieważ działa od razu. Jeśli .gitignorepliki zostaną dodane do repozytorium ( wszyscy to zrobią), będą one dla wszystkich opracowane. Nikt przypadkowo nie opublikuje swojego klucza prywatnego.

Co zabawne, dokumentacja Perforce pokazuje „.p4ignore” jako przykład ignorowania reguły, która jest odwrotna! Jeśli reguły są przydatne, należy je udostępnić w ramach repozytorium.


Perforce wciąż może zrobić coś dobrego na tej funkcji. Wybierz konwencję nazw plików, powiedzmy p4ignore.txt, aby funkcja działała jak należy. Porzuć P4IGNOREzmienną środowiskową, to przynosi efekt przeciwny do zamierzonego. Edytuj dokumenty, aby zachęcić programistów do udostępniania przydatnych reguł. Pozwól użytkownikom zapisywać osobiste reguły w pliku w ich folderze domowym, tak jak robi to Git .

Jeśli znasz kogoś w Perforce, napisz do niego ten post.

Colonel Panic
źródło
2
Dzięki za wyjaśnienie. Próbowałem użyć .p4ignore z P4VS, ale moje rozwiązanie, które miało zostać zignorowane, nie zostało zignorowane. Najpierw pomyślałem, że robię coś złego. Teraz wiem lepiej.
Michael S.
1
@gentlesea, od wersji Perforce 2013.1 funkcja ignorowania w końcu działa w aplikacji graficznej.
Panika pułkownika
2
Dyskusja „Spraw, aby funkcja ignorowania zadziałała” na p4ideax.com/ideas/17856/…
Colonel Panic
1
W przypadku zmiennych konfiguracyjnych, które różnią się w zależności od używanego obszaru roboczego, spróbuj użyć plików P4CONFIG. Następnie możesz ustawić w pliku P4CONFIG inną wartość P4IGNORE podczas przemieszczania się z obszaru roboczego do obszaru roboczego.
Bryan Pendleton
2
Perforce nie wie, jak zbudować odpowiednie oprogramowanie, nie ma nawet podstaw. Dlatego każdy, kto utknął z siłą, marzy o przejściu na gita.
Pavel P
22

Działa to od wersji Perforce 2013.1, nowy mechanizm P4IGNORE został po raz pierwszy dodany w wersji 2012.1, opisany na blogu Perforce tutaj:

https://www.perforce.com/blog/new-20121-p4ignore

Zgodnie z obecnym opisem, ustawiasz zmienną środowiskową „P4IGNORE” na nazwę pliku, która zawiera listę plików do zignorowania.

Możesz więc to sprawdzić, aby zobaczyć, jak Ci się podoba.

svec
źródło
1
Możesz także dołączyć nazwy katalogów, a nie tylko nazwy plików.
popioły 999
Jak wspomniano wcześniej: niestety MUSISZ ustawić P4IGNORE.
Technophile
1
Naprawiłem link @DerMike - wydaje mi się, że Perforce zmienił adresy URL swoich blogów.
svec,
7

Jeśli potrzebujesz rozwiązania, które będzie miało zastosowanie do wszystkich obszarów roboczych bez konieczności kopiowania, ty (lub twój administrator systemu) możesz odmówić przesłania tych typów plików, używając linii takich jak poniżej w tabeli ochrony p4:

write user * * -//.../*.suo
write user * * -//.../*.obj
write user * * -//.../*.ccscc

Pamiętam, że robiłem to wcześniej, ale nie mam niezbędnych uprawnień, aby to tutaj przetestować. Sprawdź przewodnik Perforce Sysadmin i wypróbuj go

Mike Burrows
źródło
3
Niestety powoduje to błędy przy przesyłaniu, a nie ignorowanie widoku uzgodnienia. Dzięki temu może trzymać pewne pliki z dala od repozytorium, ale nie może pomóc użytkownikom nie widzieć hałasu.
Warren P
6

Perforce Streams znacznie ułatwia ignorowanie plików od wersji 2011.1. Zgodnie z dokumentacją możesz zignorować niektóre rozszerzenia lub określone ścieżki w swoim katalogu.

Z p4 help stream

Ignored: Optional; a list of file or directory names to be ignored in
                 client views. For example:

                     /tmp      # ignores files named 'tmp'
                     /tmp/...  # ignores dirs named 'tmp'
                     .tmp      # ignores file names ending in '.tmp'

                 Lines in the Ignored field may appear in any order.  Ignored
                 names are inherited by child stream client views.

To zasadniczo robi to, co określa odpowiedź @ raven, ale jest łatwiejsze w przypadku strumieni, ponieważ automatycznie propaguje się do każdego obszaru roboczego przy użyciu tego strumienia. Dotyczy to również wszystkich strumieni dziedziczących po strumieniu, w którym określisz typy ignorowania.

Możesz edytować strumień, p4 stream //stream_depot/stream_nameklikając strumień lub klikając go prawym przyciskiem myszy w widoku strumienia p4v.

Jak zauważył @svec, możliwość określania ignorowania plików dla każdego obszaru roboczego pojawi się wkrótce i jest w rzeczywistości w P4 2012.1 beta.

Szansa
źródło
Tak, działa to w przypadku mnie, gdy mogę udostępniać ustawienia „ignoruj” w zespole (używam p4 2013.2). Zauważ, że działa tylko w składzie obsługującym strumienie. (Jeśli możesz propagować zmienną środowiskową P4IGNORE = .p4ignore w swoim zespole, to prawdopodobnie najlepsze rozwiązanie.)
jojo.
1
Zwróć uwagę, że pole Ignorowany dla strumienia może służyć do ignorowania określonego folderu, pliku lub rozszerzenia pliku, ale obsługa symboli wieloznacznych jest ograniczona i nie ma możliwości zignorowania całego folderu, a następnie „odignorowania” określonych plików lub podfolderów. (Od wersji serwera p4 2013.2)
yoyo
3

Propozycja Willa dotycząca używania .p4ignorewydaje się działać tylko z wtyczką WebSphere Studio (P4WSAD). Właśnie wypróbowałem to na moim lokalnym oknie Windows i żadne pliki i katalogi, które wymieniłem, nie zostały zignorowane.

Sugestia Ravena dotycząca modyfikacji specyfikacji klienta jest właściwą drogą w Perforce. Właściwa organizacja Twojego kodu / danych / plików wykonywalnych i wygenerowanych plików wyjściowych znacznie ułatwi proces wykluczania plików z wpisywania.

Bardziej drakońskim podejściem jest to, że zawsze możesz napisać wyzwalacz przesyłania, który odrzuci przesłanie list zmian, jeśli zawierają one określony plik lub pliki z określonym rozszerzeniem itp.

znak
źródło
15
Zupełnie nie zgadzam się z całym stwierdzeniem „Właściwa organizacja twojego kodu…”. Faktem jest, że zgodnie z konwencją Perforce edytowanie obszaru roboczego wymaga wprowadzenia zmiany przez każdego użytkownika. Natomiast prawdziwy plik .p4ignore byłby tworzony / zarządzany tylko raz.
Mike
9
Och, nie wspominając o tym, że lubisz rozgałęziać swój kod? Powodzenia w utrzymywaniu obszarów roboczych dla każdej gałęzi. Brzmi nieźle!
Mike
2

HISTORYCZNA ODPOWIEDŹ - już nie jest poprawna. W chwili, gdy to zostało napisane, było to prawdą;

Nie możesz napisać i wpisać pliku, którego serwer użyje do ignorowania reguł; ogólny wzorzec pliku glob lub regexp ignoruje z konieczności.

Inne odpowiedzi mają globalne konfiguracje serwerów, które są globalne (a nie według folderu). Inne odpowiedzi pokazują rzeczy, które mogą zadziałać, jeśli chcesz, aby jeden wiersz w widoku na folder pomnożony przez liczbę rozszerzeń, które chcesz zignorować w tym pojedynczym folderze, lub które zapewniają tę możliwość tylko we wtyczkach WebSphere Studio lub zapewniają możliwość serwera administratorzy, ale niedostępni dla użytkowników.

Krótko mówiąc, uważam, że Perforce jest naprawdę słaby w tej dziedzinie. Chociaż doceniam, że ci, którzy używają wtyczki Eclipse, mogą z niej korzystać .p4ignore, i myślę, że to świetnie, pozostawia to tych z nas, którzy tego nie robią, w ciemności.

AKTUALIZACJA: Zobacz zaakceptowaną odpowiedź na temat nowej funkcji P4IGNORE dodanej w połowie 2012 roku.

Warren P
źródło
1

Wydaje mi się, że najłatwiej jest pogodzić pracę offline za pomocą skryptu BASH, takiego jak ten:

#!/bin/bash
# reconcile P4 offline work, assuming P4CLIENT is set
if [ -z "$P4CLIENT" ] ; then echo "P4CLIENT is not set"; exit 1; fi
unset PWD # confuses P4 on Windows/CYGWIN

# delete filew that are no longer present
p4 diff -sd ... | p4 -x - delete

# checkout files that have been changed.  
# I don't run this step.  Instead I just checkout everything, 
# then revert unchanged files before committing.
p4 diff -se ... | pr -x - edit

# Add new files, ignoring subversion info, EMACS backups, log files
# Filter output to see only added files and real errors
find . -type f \
 | grep -v -E '(\.svn)|(/build.*/)|(/\.settings)|~|#|(\.log)' \
 | p4 -x - add \
 | grep -v -E '(currently opened for add)|(existing file)|(already opened for edit)'

Zaadaptowałem to z tego artykułu bazy wiedzy Perforce .

kevin cline
źródło
To było siedem lat temu, nie dziwię się. Jestem zaskoczony, że ktoś nadal używa Perforce.
kevin cline
... nie z wyboru: '(
DerMike,
0

Szukam również rozwiązania podobnego do .p4ignore (a nie takiego związanego z konkretnym IDE). Jak dotąd najbliższą rzeczą, jaką znalazłem, jest p4delta. Wygląda na to, że zrobi dokładnie to, o co prosił oryginalny plakat, choć poprzez inną warstwę pośrednictwa.

http://p4delta.sourceforge.net

Niestety, chociaż wydaje się, że tworzy to właściwą listę plików, nie mogę uruchomić "p4delta --execute" ("Nie można zmodyfikować zamrożonego ciągu"), a projekt nie był aktualizowany w ciągu roku. Może inni będą mieli więcej szczęścia.

Derek Prior
źródło
-1

Jeśli korzystasz z wtyczki Eclipse Perforce, dokumentacja wtyczki zawiera kilka sposobów ignorowania plików.

Deepak Sarda
źródło
5
duplikat i nie odpowiada na pytanie
Warren P