我试图删除git repo中的目录数组,并为每个删除的目录进行1次提交。我使用Rugged和Gitlab_git(它或多或少只是Rugged的一个包装器)到目前为止我已经设法做了我需要做的一切,除了实际的删除和提交。
我在Rugged Readme中没有看到任何解释如何删除整个树/目录的内容。我尝试将他们的提交示例用于blob并用direcotry替换单个文件,但它没有工作
我还尝试编辑他们为树构建器编写的代码,但是它添加了一个提交到我的历史记录,显示已添加的repo中的每个文件,然后左侧分段显示相同的事情。什么都没删除。
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内部有点模糊,所以也许这就是我的问题。
答案 0 :(得分:2)
git索引不会显式跟踪目录,只跟踪其内容。要删除目录,请删除其所有内容。
答案 1 :(得分:0)
您可以创建一个基于存储库中现有树的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)
这将在repo中创建提交并删除目录,但如果您没有使用:update_ref
,则可能不会更新任何分支指针。
它也不会更新您当前的工作目录或索引。如果您想更新它们,可以reset
到新HEAD
,但要小心丢失任何工作。或者,您可以使用Dir.rmdir
删除目录,模仿直接删除目录时的操作。
查看docs了解详情,尤其是Tree::Builder
和Commit.create
。