Переместите ветку git в другой репозиторий - PullRequest
0 голосов
/ 07 марта 2019

У меня есть следующий вариант использования:

У нас есть частный репозиторий gitlab, и мы хотим открыть общедоступное репозиторий github, чтобы открыть его.Но частный репозиторий и публичный репозиторий должны содержать разные версии некоторых файлов.Например, другая документация и т. Д. ...

Я пытался протолкнуть opensource_branch из частного gitlab репо в общедоступное github репо:

git push origin_github opensource_branch:master 

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

Есть какие-нибудь идеи, как решить эту проблему, не копируя и не вставляя вручную все время?

Спасибо.

PS: Конечно, я искал подобные варианты использования, но ненайти именно это.Любой другой вопрос, касающийся передачи на другие пульты дистанционного управления, не требует, чтобы определенные исторические коммиты вообще не были видны на пульте.

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Git основан на хэшах.Это означает, что целостность сохраняется вместе с каждым коммитом.

Коммит связан с его родителем, поэтому вы часто видите графики журнала Git со стрелками, указывающими на предыдущий коммит (что не кажется интуитивно понятным).В вашем случае у вас может быть такая история:

$ git log --graph --oneline
* f329c58 Fix (HEAD -> master)
* 9d13dc2 Another fix 
* 5641ac5 Spelling
* 978e43c Remove private documentation 
* 4837aab Fix code
...
* 1bcd23a Initial commit

То, что вы хотите вставить в удаленный репозиторий, это только от 978e43c.К сожалению, этот коммит имеет родителя 4837aab.Вы не можете это скрыть и сказать Git, что не надо пихать всю историю раньше.

Решение 1: Перебазировать ветку-сироту

Одно из решений - сделать коммит 978e43c сиротой, иначе говоря: без родителя.

git checkout --orphan public
git rm -rf . # Clear the working directory
git commit --allow-empty -m "Initial commit"
git rebase master..978e43c 

Тогда у вас будет совершенно новая ветка, которая не включает вашу личную документацию.

Это решение работает, но имеет несколько недостатков:

Решение 2. Изменение истории с помощью git filter-branch

Вы можете просто удалить конфиденциальную документацию из всей истории с помощью:

export PRIVATE ./documentation/private-api

git filter-branch -f \
    --prune-empty \
    --tag-name-filter cat \
    --tree-filter 'rm -rf $PRIVATE' \
    -- --all
1 голос
/ 07 марта 2019

Вы можете создать новую ветку из opensource_branch, не наследуя ее коммиты. git checkout имеет опцию --orphan для создания такой ветки. Удалите личные файлы и папки, зафиксируйте и затем нажмите.

git checkout --orphan new_branch opensource_branch
# delete the private files
git rm -rf <private_folders_files>
git commit -m 'the first commit of new_branch'
# publish new_branch to github
git push origin_github new_branch:master 

Если вы будете применять коммиты от opensource_branch к new_branch в будущем, будьте осторожны, чтобы не вводить личные файлы.

0 голосов
/ 07 марта 2019

Не уверен, что это решит вашу проблему, но вы могли бы попытаться подавить коммиты после того, как вы нажали?

...