Створення нової порожньої гілки для нового проекту


351

Ми використовуємо сховище git для зберігання нашого проекту. У нас наші відділення відходять від початкового відділення. Але зараз ми хочемо створити невеликий новий проект для відстеження деякої документації. Для цього ми хотіли б створити нову порожню гілку, щоб почати зберігати наші файли, і я хотів би, щоб інші користувачі мережі клонували її.

Як ми можемо це зробити?

Я спробував деякі речі, але вони не спрацювали.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Здається, натисніть на гілку добре, але коли я забираю або витягую, вона завантажує інформацію з інших гілок, і тоді я також отримую кілька додаткових файлів з інших проектів. Яке найкраще рішення?


11
Чому потрібно зберігати це у філії? Гілки зазвичай мають деякі відхилення від тієї ж бази коду. Можливо, кращим рішенням було б просто запустити новий сховище.
Бенджамін Баньє

2
Ну, ми це робили раніше, IIRC, і я хотів би це зробити ще раз, тому мені цікаво;)
fazineroso

3
"для нового проекту" - Як @honk я б запропонував помістити це в нове сховище. Звідти два варіанти їх інтеграції. Зробіть це submoduleв оригінальному проекті, наприклад, docs/вказуючи на це інше репо. Або, якщо ви хочете пізніше об'єднати код, додайте його як віддалений.
gertvdijk

1
Одним із додаткових недоліків підходу- сироти є те, що вам потрібно зберігати свої .gitignored-файли, а також постійно перемикатися між двома коренями (гілками). Тож я також за новий підхід до репо, в новій папці, маючи ті ж пульти та натискаючи на іншу гілку.
simo

Відповіді:


666

Ви можете створити гілку як сироту:

git checkout --orphan <branchname>

Це створить нове відділення без батьків. Потім можна очистити робочий каталог за допомогою:

git rm --cached -r .

і додайте файли документації, скопіюйте їх і піднесіть їх до github.

Потяг або отримання завжди оновлюватиме локальну інформацію про всі віддалені гілки. Якщо ви хочете лише отримати / отримати інформацію для однієї віддаленої гілки, вам потрібно вказати її.


18
Приємна відповідь, але це щось дратує, що нова гілка починається з усіх встановлених файлів (з попередньої гілки).
Метт Фенвік

12
При видачі git checkout --orphan <branch>; Я не бачу жодного списку <branch> в git branch.
Сантош Кумар

51
Після git checkout --orphanцього можна git reset --hardвидалити залишені файли.
Ілля Кожевников

16
Причина, через яку ви не бачите філію після, git checkout --orphan <branch>- це ще не має жодних комісій. Після першого фіксування git branchдрукує нову гілку.
Krøllebølle

13
git clean -fd видаляє незатребувані файли.
stefgosselin

71

Правильна відповідь - створити осиротіле відділення. Я пояснюю, як це зробити докладно у своєму блозі. (Заархівоване посилання)

...

Перед початком оновлення до останньої версії GIT. Щоб переконатися, що ви використовуєте останню версію, запустіть

which git

Якщо вона виписує стару версію, можливо, вам доведеться доповнити свій PATH папкою, що містить версію, яку ви тільки що встановили.

Гаразд, ми готові. Після того, як ви зробите компакт-диск у папку, яка містить ваш git checkout, створіть відділення-сироту. Для цього прикладу я назву галузь «мій галузь».

git checkout --orphan mybranch

Видаліть усе у відділенні сиріт

git rm -rf .

Внесіть деякі зміни

vi README.txt

Додайте та введіть зміни

git add README.txt
git commit -m "Adding readme file"

Це воно. Якщо ти біжиш

git log

ви помітите, що історія фіксації починається з нуля. Щоб повернутися до головної гілки, просто запустіть

git checkout master

Ви можете повернутися до осірої гілки, запустивши

git checkout mybranch

16
Відповіді лише на посилання не рекомендуються. Якщо посилання буде переміщено або видалено, ваша відповідь стає нікчемною. Подумайте про додавання істотних частин до цієї самої відповіді. Зверніть особливу увагу на ті питання, які не охоплені попередніми відповідями.
bytebuster

3
На жаль, посилання більше не діє, на жаль.
Олексій

1
Архів - це чудова річ.
lucid_dreamer

3
НЕБЕЗПЕЧНО просто видалити все з робочого каталогу, оскільки будь-який нетривіальний проект матиме неперевірені файли (конфігурація, середовище, кеш тощо).
Слава Фомін II

12

Зробіть порожню нову гілку так:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Якщо ваші файли proj-doc вже перебувають у фіксації під одним піддіректом, ви можете зробити нову гілку таким чином:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

який може бути більш зручним , ніж git branch --orphanякби залишити вас з великою кількістю git rmі git mvING робити.

Спробуйте

git branch --set-upstream proj-doc origin/proj-doc

і подивіться, чи це допомагає у вирішенні ваших проблем. Також якщо ви хочете отримати лише одну гілку, найбезпечніше просто вказати її в командному рядку.


1
Ця відповідь цікава, оскільки дозволяє запустити іншу гілку / корінь із абсолютно порожнім першим комітом.
Стефан Гурішон

Ще один спосіб зробити порожню гілку, якщо ви не проти перейти на неї,git checkout --orphan new-branch; git reset --hard
jthill

В чому користь xargs?
Флюс

@Flux - це просто інший спосіб отримати ідентифікатор дерева subbed в аргументі дерева дерев.
jthill

Мені дуже подобається такий підхід, оскільки це дозволяє створити нову порожню гілку, не виходячи з поточної гілки, плюс той факт, що порожня фіксація є початковою точкою.
Бріс

8

Якщо у вашій версії git немає опції --orphan, слід використовувати цей метод:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Після виконання певної роботи:

git add -A
git commit -m <message>
git push origin <newbranch>

2
Будьте уважні, git cleanможете видалити файли, які ви не хочете видаляти! Запустіть git clean -ndxспочатку, щоб побачити, які файли буде видалено, перш ніж запустити їх у реальному -fваріанті.
Лассі

7

Скажімо, у вас є masterвідділення з файлами / каталогами:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Крок за кроком, як зробити порожню гілку:

  1. git checkout —orphan new_branch_name
  2. Переконайтеся, що ви знаходитесь у правильному каталозі, перш ніж виконати таку команду:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

На кроці 2 ми просто видаляємо всі файли локально, щоб уникнути плутанини з файлами у вашій новій гілці та тими, які ви зберігаєте у masterвідділенні. Потім ми з'єднуємо всі ці файли на кроці 3. Нарешті, крок 4 і після цього працюємо з новою порожньою гілкою.

Щойно ви закінчите, ви можете легко переходити між своїми гілками:

git checkout master 
git checkout new_branch

1

На основі цієї відповіді від Hiery Nomus .

Ви можете створити гілку як сироту:

git checkout --orphan <branchname>

Це створить нове відділення без батьків. Потім можна очистити робочий каталог за допомогою:

git rm --cached -r .

І тоді ви просто здійснюєте відділення з порожнім фіксом, а потім натискаєте

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

Ознайомтеся з цією документацією , в ній є чіткі деталі

--orphan <new_branch>
Створіть нову гілку-сироту, названу <new_branch>, розпочату з неї <start_point>та перейдіть на неї. Перший вчинок, зроблений на цій новій гілці, не матиме батьків, і це буде корінь нової історії, повністю відключеної від усіх інших гілок і зобов'язань.

Індекс та робоче дерево коригуються так, ніби ви раніше виконували git checkout. Це дозволяє запустити нову історію, яка записує набір шляхів, схожих з легким запуском git commit -a, щоб зробити кореневу фіксацію.


1
Посилання на рішення вітається, але будь ласка, переконайтеся, що ваша відповідь корисна без нього: додайте контекст навколо посилання, щоб ваші колеги користувачі мали уявлення про те, що це таке і чому воно є, а потім наведіть найбільш релевантну частину сторінки, яку ви ' повторне посилання на випадок, якщо цільова сторінка недоступна. Відповіді, які є трохи більше ніж посилання, можуть бути видалені.
Yunnosch

1

я знайшов цю допомогу:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.