Удаление дерева и коммит с Rugged

Я пытаюсь удалить массив каталогов в репозитории git и сделать 1 коммит для каждого удаленного каталога. Я использую Rugged и Gitlab_git (который является более или менее просто оболочкой Rugged), и до сих пор мне удавалось делать все, что мне нужно, кроме фактического удаления и фиксации.

Я не вижу ничего в Rugged Readme, объясняющего, как удалить все дерево/каталог. Я попытался использовать их пример фиксации для большого двоичного объекта и заменить один файл каталогом, но это не сработало.

Я также попытался отредактировать код, который у них был для построителя дерева, но он добавил коммит в мою историю, который показывал, что каждый файл, когда-либо добавленный в репо, был добавлен, а затем оставил промежуточный этап, показывающий то же самое. Ничего не было удалено.

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 => "[email protected]", :name => 'Test Author', :time => Time.now }
options[:committer] = { :email => "[email protected]", :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, так что, возможно, это моя проблема.


person Jtgrenz    schedule 20.10.2016    source источник


Ответы (2)


Индекс git явно не отслеживает каталоги, а только их содержимое. Чтобы удалить каталог, выполните поэтапное удаление всего его содержимого.

person Jason Haslam    schedule 28.10.2016

Вы можете создать 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.

Он также не будет обновлять ваш текущий рабочий каталог или index. Если вы хотите обновить их, вы можете reset на новый HEAD, но будьте осторожны, чтобы не потерять работу. В качестве альтернативы вы можете просто удалить каталог с помощью Dir.rmdir, имитируя то, что вы делаете при удалении каталога напрямую.

Ознакомьтесь с документами для получения дополнительной информации, особенно Tree::Builder и Commit.create.

person matt    schedule 23.12.2016