#ruby #git #gitlab #libgit2 #rugged
#ruby #git #gitlab #libgit2 #rugged
Вопрос:
Я пытаюсь удалить массив каталогов в репозитории git и сделать 1 фиксацию для каждого удаленного каталога. Я использую Rugged и Gitlab_git (который является более или менее просто оболочкой для Rugged), и до сих пор мне удавалось делать все, что мне нужно, за исключением фактического удаления и фиксации.
Я не вижу ничего в Rugged Readme, что объясняет, как удалить все дерево / каталог целиком. Я попытался использовать их пример фиксации для большого двоичного объекта и заменить один файл direcotry, но это не сработало
Я также попытался отредактировать код, который у них был для построения дерева, но он добавил фиксацию в мою историю, которая показала, что были добавлены все файлы, когда-либо находившиеся в репозитории, а затем оставил staging, показывающий то же самое. Ничего не было удалено.
oid = repo.write("Removing folder", :blob)
builder = Rugged::Tree::Builder.new(repo)
builder << { :type => :blob, :name => "_delete", :oid => oid, :filemode => 0100644 }
options = {}
options[:tree] = builder.write
options[:author] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
options[:committer] = { :email => "testuser@github.com", :name => 'Test Author', :time => Time.now }
options[:message] ||= "Making a commit via Rugged!"
options[:parents] = repo.empty? ? [] : [ repo.head.target ].compact
options[:update_ref] = 'HEAD'
Rugged::Commit.create(repo, options)
Есть предложения? Я все еще немного не разбираюсь во внутренних компонентах git, так что, возможно, это моя проблема.
Комментарии:
1. вы пробовали rubydoc.info/github/libgit2/rugged/Rugged /… ?
Ответ №1:
Индекс git явно не отслеживает каталоги, только их содержимое. Чтобы удалить каталог, выполните поэтапное удаление всего его содержимого.
Ответ №2:
Вы можете создать Tree::Builder
, основанное на существующем дереве в репозитории, которым затем вы можете манипулировать по своему усмотрению.
Если у вас уже есть Commit
объект, который вы хотите использовать в качестве родительского коммита, то вы можете сделать это:
parent_commit = ... # e.g. this might be repo.head.target
# Create a Tree::Builder containing the current commit tree.
tree_builder = Rugged::Tree::Builder.new(repo, parent_commit.tree)
# Next remove the directory you want from the Tree::Builder.
tree_builder.remove('path/to/directory/to/remove')
# Now create a commit using the contents of the modified tree
# builder. (You might want to include the :update_ref option here
# depending on what you are trying to do - something like
# :update_ref => 'HEAD'.)
commit_data = {:message => "Remove directory with Rugged",
:parents => [commit],
:tree => tree_builder.write
}
Rugged::Commit.create(repo, commit_data)
Это создаст фиксацию в репозитории с удаленным каталогом, но может не обновлять указатели на ветви, если вы не использовали :update_ref
.
Это также не приведет к обновлению вашего текущего рабочего каталога или индекса. Если вы хотите обновить их, вы могли бы reset
перейти на новые HEAD
, но будьте осторожны, чтобы не потерять какую-либо работу. В качестве альтернативы вы могли бы просто удалить каталог с помощью Dir.rmdir
, имитируя то, что вы сделали бы при непосредственном удалении каталога.
Ознакомьтесь с документами для получения дополнительной информации, особенно Tree::Builder
и Commit.create
.