Случайно удалил файлы с помощью ОС. Как их восстановить? - PullRequest
0 голосов
/ 28 апреля 2020

Последовательность событий:

  1. создал файл A
  2. добавил его в хранилище: p4 add A
  3. отправил его в хранилище: p4 submit A
  4. случайно удалил его из моего рабочего каталога: \rm -f A

Что такое команда magi c p4, которая вернет ее в мой рабочий каталог?

Попробовал и не получилось

 1. p4 sync
 2. p4 sync -f 
 3. p4 edit A
 4. p4 sync A
 5. p4 sync -f A

1 Ответ

1 голос
/ 28 апреля 2020

Если файл открыт для редактирования (и если это так, то позор, что вы исключили его из своей первоначальной последовательности событий), sync -f не коснется его, пока вы не вернетесь, и в этот момент вы верните депо версию файла. Просто сделайте:

p4 revert A

Если файл не открыт, то p4 sync -f A должен сделать это, но вам действительно нужна команда:

p4 clean

, которая будет go через весь ваш клиент и «очистите» все неоткрытые файлы, которые не соответствуют вашему синхронизированному состоянию. Чтобы увидеть ваше синхронизированное состояние, используйте p4 have (с аргументом файла или без него).


Последовательность событий в данном конкретном случае выглядит примерно так:

C:\Perforce\test>p4 edit foo
//stream/main/foo#4 - opened for edit

C:\Perforce\test>del foo

At эта точка, foo открыта для редактирования, но отсутствует в локальной файловой системе. Попытка отправить его не удастся, потому что он открыт для edit, а не delete:

C:\Perforce\test>p4 submit -d "my awesome edit"
Submitting change 156.
Locking 1 files ...
edit //stream/main/foo#5
open for read: c:\Perforce\test\foo: The system cannot find the file specified.
Submit aborted -- fix problems then use 'p4 submit -c 156'.
Some file(s) could not be transferred from client.

Выполнение p4 sync -f ничего не изменит, потому что sync всегда пропускает открытые файлы, кроме как обновить рабочую ревизию; так как вы уже работаете над ревизией заголовка, он просто сообщит «в актуальном состоянии»:

C:\Perforce\test>p4 sync -f foo
foo - file(s) up-to-date.

Аналогично, p4 edit ничего не будет делать, потому что (a) файл уже открыт для отредактируйте и (b) p4 edit только откроет существующий файл в вашей рабочей области; он не синхронизирует c, не изменяет его содержимое. (Он выполняет chmod, но если chmod завершается неудачно, файл открывается независимо от того.)

C:\Perforce\test>p4 edit foo
//stream/main/foo#4 - currently opened for edit
(file is still missing)

Один из способов исправить ситуацию с отсутствующим файлом - это заменить исходный файл вручную, либо скопировав его из другого места. или с помощью p4 print, как показано ниже:

C:\Perforce\test>p4 print -o foo //stream/main/foo
//stream/main/foo#4 - edit change 119 (text)

Метод ручной замены создает риск того, что содержимое не соответствует проверенной вами ревизии, что может привести к отсутствию данных (т. е. вы ' я буду дурачить логику разрешения конфликтов c, думая, что вы сознательно добавили / удалили изменение в зависимости от версии файла, который вы только что захватили).

Вместо этого я бы порекомендовал сделать возврат и снова открыть файл :

C:\Perforce\test>p4 revert foo
//stream/main/foo#4 - was edit, unlocked and reverted

C:\Perforce\test>p4 edit foo
//stream/main/foo#4 - opened for edit

revert автоматически заменит файл соответствующей версией депо; когда вы снова откроете его для редактирования, у вас будет свободный sh старт.

...