2015-01-15 1 views
1

Как и для this question, но вместо создания нового файла, я пытаюсь объединиться из источника. После создания нового индекса с использованием Rugged::Repository 's merge_commits и нового коммита слияния git сообщает новый файл (исходящий от origin) как удаленный.Прочный сбор слияния из источника не обновляет рабочее дерево

Создание индекса слияния,

> origin_target = repo.references['refs/remotes/origin/master'].target 
> merge_index = repo.merge_commits(repo.head.target, origin_target) 

и новое слияние совершить,

> options = { 
    update_ref: 'refs/heads/master', 
    committer: {name: 'user', email: '[email protected]', time: Time.now}, 
    author: {name: 'user', email: '[email protected]', time: Time.now}, 
    parents: [repo.head.target, origin_target], 
    message: "merge `origin/master` into `master`"} 

и убедитесь, что использовать дерево из индекса слияния.

> options[:tree] = merge_index.write_tree(repo) 

Создание фиксации

> merge_commit = Rugged::Commit.create(repo, options) 

Убедитесь, что наша голова была обновлена:

> repo.head.target.tree 
=> #<Rugged::Tree:16816500 {oid: 16c147f358a095bdca52a462376d7b5730e1978e}>            
<"first_file.txt" 9d096847743f97ba44edf00a910f24bac13f36e2>              
<"second_file.txt" 8178c76d627cade75005b40711b92f4177bc6cfc>                
<"newfile.txt" e69de29bb2d1d6434b8b29ae775ad8c2e48c5391> 

Выглядит хорошо. Я вижу новый файл в индексе. Напишите его на диск.

> repo.index.write 
=> nil 

... но Git отчеты новый файл как удаленный:

$ git st 
## master...origin/master [ahead 2] 
D newfile.txt 

Как правильно обновить свой индекс и рабочее дерево?

+0

Вызов 'repo.reset repo.head.target,: hard' отменяет« удаление », и вызов его снова возвращает меня в чистый рабочий каталог. Поэтому я могу подтвердить, что 'repo.index.write' не пишет рабочий каталог, несмотря на то, что указано в [документах] (http://www.rubydoc.info/gems/rugged/0.21.3/Rugged/Index # записи instance_method). Итак, как мне обновить рабочий каталог? – occamsquattro

ответ

0

Существует важное различие между репозиторием Git и рабочим каталогом. Хотя наиболее распространенные команды командной строки командной строки работают как в рабочем каталоге, так и в репозитории, команды нижнего уровня libgit2/librugged в основном работают только с репозиторией. Это включает в себя запись индекса, как в вашем примере.

Чтобы обновить рабочий каталог в соответствии с индексом, следующая команда должна работать (после написания индекса):

options = { strategy: force } 
repo.checkout_head(options) 

Docs для checkout_head: http://www.rubydoc.info/github/libgit2/rugged/Rugged/Repository#checkout_head-instance_method

Примечание: Я проверил с update_ref: 'HEAD' для совершить. Я не уверен, что update_ref: 'refs/heads/master' будет иметь тот же эффект.