2016-10-31 3 views
0

У меня есть репозиторий, где ветка (admin) была разветвленной от develop в какой-то момент. Это примерно так выглядитGit - Как разбить ветку в собственном репозитории?

develop   c2  c4  c5 
     *------------*---------*---------*------------... 
     c1   \ 
        \____________________*c3 
          admin 

Я хочу, чтобы ветка разработки осталась прежней, а ветвь администратора должна иметь собственный репозиторий. Для записи я использую sourcetree + bitbucket.

Я попробовал метод, упомянутый в this answer и попробовал git push url://to/new/repository.git admin:develop. Что я сделал в своем новом репо, так это то, что история началась с первой фиксации разработки (c1). он выглядит так в новом репозитории.

c1  c2       c3 
*-------*----------------------------* 
      develop 

Я хотел бы начать этот новый репозиторий с c2. Это нормальное поведение или я сделал что-то неправильно? Каков правильный способ достижения желаемого результата?

ответ

0

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

Рассмотрим эту историю:

* cd857c2 (HEAD -> develop) c5 
* eda39a7 c4 
| * 49671f2 (admin) c3 
|/ 
* 53b169b c2 
* 42bf35f c1 

Я хотел бы предложить создание филиала сироту из c2

git checkout --orphan newDev 53b169b 

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

git commit -m "c1/c2" 

И наконец, вишня - выберите диапазон коммитов от начального фиксации до кончика ветви администратора.

git cherry-pick 53b169b..admin 

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

* d19cdd1 (HEAD -> newDev) c3 
* f886282 c1/c2 

Наконец-то нажмите эту новую ветку.

git push url://to/new/repository.git newDev:develop 
0
git checkout -b sliced-admin admin     # start with admin 
git rev-list develop.. | tail -1 >.git/info/grafts # slice out the develop history 
git filter-branch         # . 
rm .git/info/grafts         # . 

Теперь нажмите нарезанных-администратора филиала, где вы хотите

git push u://r/l sliced-admin:itsnamethere 
+0

Влияет ли этот процесс исходный репозиторий? Я не хочу, чтобы что-то происходило с остальными ветвями или историей этого репо. Я не возражаю, если ветвь 'admin' удаляется, хотя. – VeeK

+0

Нет, в его нынешнем виде это затрагивает только ветку sliced-admin. – jthill

+0

Я не понимаю вашу вторую строку, и она не описана в [documentation] (https://git-scm.com/docs/git-rev-list). Я ввел эту строку ** точно ** и получил 'bash: .git/info/grafts: Нет такого файла или каталога' – VeeK