Почему я не могу удалить свой депо в Perforce?

Вопрос или проблема

Я просто занимаюсь экспериментами в локальной базе данных 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" не содержит файлов, возможно, у него остались пустые папки или другие структуры, которые не позволяют удалить его.

Вот пошаговая инструкция по решению этой проблемы:

  1. Удалите пустые папки и структуры: Убедитесь, что в депо нет никаких отпечатков данных. Используйте команду:

    p4 obliterate -y //sandbox/...

    Это должно удалить все файлы и связанные записи. Если при выполнении данной команды вы видите "No records to delete", это может указывать на то, что депо действительно не содержит файлов, но стоит проверить наличие каких-либо оставшихся пустых папок.

  2. Используйте флаг принудительного удаления: Если в вашем депо остались пустые папки, которые не были удалены, вы можете воспользоваться флагом -f для принудительного удаления. Выполните следующую команду:

    p4 depot -f -d sandbox

    Данный подход должен позволить вам удалить депо, даже если в нем остались пустые папки или структуры.

  3. Проверка зависимостей: Перед удалением убедитесь, что у вас нет активных связей с другими депо. Если ваше депо каким-либо образом связано с другими, вам потребуется разорвать эти связи.

  4. Автоматизация с помощью P4Python: Если вы хотите этим процессом управлять автоматически с помощью P4Python, вы можете использовать аналогичные команды в вашем скрипте. Убедитесь, что при вызове команд вы добавляете соответствующие параметры для принудительного удаления.

Пример кода на P4Python:

from P4 import P4

p4 = P4()
try:
    p4.connect()
    # Принудительное удаление депо
    p4.run('depot', '-f', '-d', 'sandbox')
finally:
    p4.disconnect()

С помощью этих шагов вы должны успешно удалить ваше депо в Perforce. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...