2014-09-12 5 views
0

У меня есть zip-файл, содержащий проект Ruby on Rails. У меня также есть полный репозиторий Git этого же проекта Ruby on Rails. Zip-файл по существу является дочерней дочерней ветвью полного репозитория git. Если бы он был правильно включен в репозиторий Git, он бы отделил от мастера несколько изменений за ревизией HEAD текущего хозяина. К сожалению, для меня zip-файл не содержит репозитарий Git и представляет собой только плоские файлы, из-за чего мне приходится проверять zip-файл на наличие изменений. Излишне говорить, что это довольно утомительно, поэтому, пока я работаю над этим, я надеюсь, что SO поможет мне лучше решить эту проблему!Git - сравнение папки с репозиторием git той же папки

Что я прошу помощь заключается в следующем:

Есть ли способ, чтобы сравнить папку, которая не является репозиторий с папкой, которая находится под контролем Git и? Помните, что каталоги - это проекты Ruby on Rails проекта того же проекта, только один находится в Git, а другой нет, поэтому ему не хватает всего исторического контекста, в котором можно легко слить слияние.

Я уже пробовал вставлять содержимое zip-файла поверх основного каталога моего проекта и проверять различия в этом. Это просто удаляет почти полтора месяца работы, что дает git diff с тоннами удаления и потенциальными регрессиями. Возможно, есть способ определить из этой информации, когда zip-файл расходится с мастером и создает ветвь, которая расходится с этой фиксацией? Затем я мог бы объединить или переустановить только соответствующие изменения, не беспокоясь об изменениях, которые я сделал, которые мне нужно сохранить.

В любом случае, спасибо заранее.

ответ

2

Простое решение: git clone и diff клонированное репо против неконтролируемой реж.

Более сложное решение может включать привлечение неконтролируемого репо в отдельную ветку и выполнение слияния.

0

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

git checkout --orphan zip_extract 
git rm -rf . 

Распакуйте, мерзавец добавить --all, мерзавец совершить

Вы бы после этого нужно что-то сценария, который сделал

for sha in ($git rev-list OLDEST_POTENTIAL_SHA..NEWEST_POTENTIAL_SHA) 
do 
    git diff [options] ${sha} zip_extract | analysis_script 
done 

Вы можете поэкспериментировать с некоторыми вариантами стата мерзавца различий и труб на awk, или вы можете просто выгрузить полный diff и pipe в wc -l.

Оптимистически один из них выпрыгнет из строя, как более прав, чем другие. Затем вы отделитесь от этой точки и извлечете ее туда (или слейте из сиротской ветви), а затем попытайтесь объединить ее для освоения.

Удачи.

0

Вы попробовали git bisect ??. Это поможет вам найти фиксацию, которую вы ищете. В вашем репо начинайте делиться от HEAD до некоторой фиксации, для которой вы уверены, что она находится в папке с не-git.

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

git bisect start HEAD some_old_commit_id 
git bisect bad 
git bisect good 
git bisect bad 
1

Я заканчивал найти способ решить это сам.

Я запустил git init в распакованной папке, добавил и передал все файлы и создал «начальную фиксацию». Затем я устанавливаю свой репозиторий папок проекта как удаленный для нового репозитория git. Это позволяет мне объединить новый код поверх осиротевшего кода: git merge local/HEAD master. Как только я завершил слияние и столкнулся с конфликтами, я был готов запустить этот процесс в обратном порядке.

Я добавил пульт в каталог моего проекта, указав на zip-каталог git-репозитория, и объединил его в ветку темы. git merge orphaned_directory/HEAD orphaned_code_branch. Я снова столкнулся с конфликтами, стараясь не вводить регрессии.

После этого было сделано, вуаля. Прохождение тестов и интеграция кода. Спасибо всем за то, что помогли мне провести мозговой штурм этой проблемы.