Вопрос или проблема
Я просто занимаюсь экспериментами в локальной базе данных Perforce, пытаясь разобраться, как можно вернуть Perforce в предыдущее состояние без ведения журнала или удаления и воссоздания файлов базы данных.
У меня есть несколько депо без файлов, одно из которых называется “песочница”. Я создал его с помощью команды p4 depot
либо из командной строки, либо с использованием API P4Python (на данный момент не помню, что именно использовал).
Когда я набираю:
p4 depot -d sandbox
, я получаю следующее:
Депо sandbox не пусто. Чтобы удалить депо, необходимо удалить все ревизии файлов и разорвать все ленивые ссылки на копии из других депо. Используйте ‘p4 obliterate’ или ‘p4 snap’, чтобы разорвать связи с файлами из других депо, затем очистите это депо с помощью ‘p4 obliterate’, а затем повторите попытку удаления.
Я попробовал p4 obliterate -y //sandbox/...
, но она просто говорит No records to delete.
, что ожидаемо, так как депо пустое. Так или иначе, это не изменяет результат от p4 depot -d
. Кроме того, как предполагает сообщение об ошибке, нет никаких ссылок из других депо.
Есть ли у кого-то идеи, что происходит, и есть ли надежный способ заставить удалить депо, не удаляя файлы сервера полностью? В конечном итоге я хочу сделать это автоматически через P4Python.
ПРИМЕЧАНИЕ: Если это что-то значит, вот журнал сервера во время операции obliterate:
2012/04/11 09:30:18 pid 6916 username@machinename 127.0.0.1 [p4/2011.1/NTX86
/370818] 'user-obliterate -y //sandbox/...'
--- lapse .561s
--- rpc msgs/size in+out 0+1/0mb+0mb himarks 64836/64836
--- db.counters
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+436ms
--- db.user
--- pages in+out+cached 2+0+1
--- locks read/write 1/0 rows get+pos+scan put+del 1+0+0 0+0
--- db.group
--- pages in+out+cached 2+0+1
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
--- db.domain
--- pages in+out+cached 3+0+1
--- locks read/write 2/0 rows get+pos+scan put+del 1+2+8 0+0
--- total lock wait+held read/write 0ms+436ms/0ms+0ms
--- max lock wait+held read/write 0ms+436ms/0ms+0ms
--- db.view
--- pages in+out+cached 3+0+1
--- locks read/write 2/0 rows get+pos+scan put+del 0+2+6 0+0
--- total lock wait+held read/write 0ms+436ms/0ms+0ms
--- max lock wait+held read/write 0ms+436ms/0ms+0ms
--- db.integed
--- pages in+out+cached 3+0+2
--- locks read/write 0/1 rows get+pos+scan put+del 0+1+1 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+390ms
--- db.resolve
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+343ms
--- db.have
--- pages in+out+cached 3+0+2
--- locks read/write 0/1 rows get+pos+scan put+del 0+1+1 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+296ms
--- db.label
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+249ms
--- db.locks
--- pages in+out+cached 3+0+2
--- locks read/write 0/1 rows get+pos+scan put+del 0+1+1 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+171ms
--- db.archmap
--- pages in+out+cached 2+0+1
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
--- db.rev
--- pages in+out+cached 4+0+2
--- locks read/write 1/1 rows get+pos+scan put+del 0+2+2 0+0
--- total lock wait+held read/write 0ms+16ms/0ms+171ms
--- db.revcx
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+140ms
--- db.revdx
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+93ms
--- db.revhx
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+62ms
--- db.revsx
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+46ms
--- db.working
--- pages in+out+cached 2+0+1
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+31ms
--- db.traits
--- pages in+out+cached 4+3+2
--- locks read/write 0/1 rows get+pos+scan put+del 0+0+0 0+0
--- total lock wait+held read/write 0ms+0ms/0ms+31ms
--- db.protect
--- pages in+out+cached 2+0+1
--- locks read/write 1/0 rows get+pos+scan put+del 0+1+1 0+0
Я решил эту проблему с помощью флага force
p4 depot -f -d sandbox
так как моя папка депо содержала кучу пустых папок, которые не удалялись с помощью obliterate.
Ответ или решение
Вам не удается удалить депо в Perforce, потому что Perforce не позволяет удалить депо, если оно не пустое. Для успешного удаления депо необходимо, чтобы все ревизии файлов внутри этого депо были удалены, а все ссылки на "ленивые копии" в других депо были разорваны. В вашем случае, несмотря на то, что вы указали, что депо "sandbox" не содержит файлов, возможно, у него остались пустые папки или другие структуры, которые не позволяют удалить его.
Вот пошаговая инструкция по решению этой проблемы:
-
Удалите пустые папки и структуры: Убедитесь, что в депо нет никаких отпечатков данных. Используйте команду:
p4 obliterate -y //sandbox/...
Это должно удалить все файлы и связанные записи. Если при выполнении данной команды вы видите "No records to delete", это может указывать на то, что депо действительно не содержит файлов, но стоит проверить наличие каких-либо оставшихся пустых папок.
-
Используйте флаг принудительного удаления: Если в вашем депо остались пустые папки, которые не были удалены, вы можете воспользоваться флагом
-f
для принудительного удаления. Выполните следующую команду:p4 depot -f -d sandbox
Данный подход должен позволить вам удалить депо, даже если в нем остались пустые папки или структуры.
-
Проверка зависимостей: Перед удалением убедитесь, что у вас нет активных связей с другими депо. Если ваше депо каким-либо образом связано с другими, вам потребуется разорвать эти связи.
-
Автоматизация с помощью P4Python: Если вы хотите этим процессом управлять автоматически с помощью P4Python, вы можете использовать аналогичные команды в вашем скрипте. Убедитесь, что при вызове команд вы добавляете соответствующие параметры для принудительного удаления.
Пример кода на P4Python:
from P4 import P4
p4 = P4()
try:
p4.connect()
# Принудительное удаление депо
p4.run('depot', '-f', '-d', 'sandbox')
finally:
p4.disconnect()
С помощью этих шагов вы должны успешно удалить ваше депо в Perforce. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.