Удаление дерева и фиксация с помощью Rugged

#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 .