2015-06-18 2 views
1

Из нижеследующего кода (источник: Merge two Git repositories without breaking file history) у меня возникли проблемы с визуализацией, где точно старая_a/master и old_b/master указывают на каждый шаг процесса.Где именно указывает удаленная ветвь после извлечения?

# Assume the current directory is where we want the new repository to be created 
# Create the new repository 
git init 

# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit 
dir > deleteme.txt 
git add . 
git commit -m "Initial dummy commit" 

# Add a remote for and fetch the old repo 
git remote add -f old_a <OldA repo URL> 

# Merge the files from old_a/master into new/master 
git merge old_a/master 

# Clean up our dummy file because we don't need it any more 
git rm .\deleteme.txt 
git commit -m "Clean up initial file" 

# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later 
mkdir old_a 
dir -exclude old_a | %{git mv $_.Name old_a} 

# Commit the move 
git commit -m "Move old_a files into subdir" 

# Do the same thing for old_b 
git remote add -f old_b <OldB repo URL> 
git merge old_b/master 
mkdir old_b 
dir –exclude old_a,old_b | %{git mv $_.Name old_b} 
git commit -m "Move old_b files into subdir" 

Мои вопросы: 1) Может ли кто-то нарисовать (диаграммы W/указатели), что происходит со всеми существующими указателями на каждом шаге в этом процессе? 2) Что произойдет, если вы выполните git push old_a master или git push old_b master после описанных выше шагов? (Делают ли репозитории всю новую папку с файлом old_a + old_b и почему?)

Цените любое понимание!

ответ

0

Я не буду нарисовать диаграмму, но gitk (или git log --oneline --graph --decorate, если вы предпочитаете текстовый режим), может сделать это за вас. По умолчанию, они показывают историю достижима из HEAD, добавьте --all если вы хотите, чтобы увидеть все ветви в то же время, или запустить gitk old_a/master old_b/master для просмотра только истории два ссылок удаленного отслеживания вы заинтересованы в.

0

1) Я не собираюсь рисовать для вас. Используйте gitk -a, чтобы провести свою историю самостоятельно. 2) Я не уверен, что ваши команды dir|%{} являются правильными, так как я не использую Windows cmds, но да, если вы нажмете на old_a a/o old_b, они будут иметь тот же макет, что и ваш локальный репозиторий, то есть

./old_a/AFILES 
./old_b/BFILES 

потому что git даже не заботится о файлах. Внутренне git просто работает с содержимым, но вы сказали git о mv всех файлах old_a в новый каталог ./old_a и тот же для old_b.

Фактически git mv - это оболочка mv plus git rm oldpath и git add newpath. эти комбинации rm/add будут отправляться в old_a и old_b, когда вы нажимаете эту фиксацию.

Смежные вопросы