Поддерживать разную структуру каталогов в разных ветках Git - PullRequest
6 голосов
/ 17 декабря 2011

У меня была проблема с мерзавцем. У меня есть хранилище проекта, который стареет, и хочу запустить новую версию. Я создал новую ветку (3.0-wip) и удалил файлы и папки, чтобы начать снова. Однако, если я извлекаю свою основную ветку, файлы и папки также исчезают.

Как я могу иметь свой репозиторий, чтобы в моей главной ветке было все, что есть у удаленного репо, но совершенно другой рабочий каталог в моем 3.0-wip, который я могу изменить по своему усмотрению, не разрушая файлы и папки в любой другой ветке?

Ответы [ 2 ]

8 голосов
/ 17 декабря 2011

То, что происходит, - вы не используете git правильно. Нет абсолютно никаких проблем с созданием ветки и удалением файлов и папок. Когда вы вернетесь к своей основной ветке, удаленные файлы и папки будут восстановлены, так как они не были удалены из этой ветви.

В вашем случае происходит то, что вы удалили файл / папки из-под git, используя удаление операционной системы, а не команду «git rm». Вот почему git status сообщает о них как о «удаленных». Это также, почему файлы остаются удаленными, когда вы переключаете ветви. git ожидает, что файлы будут там, а их нет.

Состояние Git говорит вам, что нужно запустить «git add», но это не работает. Поскольку файла больше нет, запуск git add завершится с ошибкой. Вы можете не заметить, но в сообщении также говорится, что вы должны запустить «git rm». Вы можете подумать, что не можете этого сделать, так как файл исчез, но это не так. Команда rm все равно удастся удалить файл из репозитория, даже если вы уже удалили его из файловой системы.

Другая, более простая вещь, которую вы можете сделать, это запустить git add -A. Флаг -A скажет добавить, чтобы заметить любые удаленные или добавленные файлы.

Попробуйте это для теста:

git init test-delete
cd test-delete
touch filea
mkdir dir_b
touch dir_b/fileb
git add .
git commit -m "Initial commit"
git checkout -b new_branch
rm -rf dir_b
git add -A
git commit -m "deleted files from branch"
(ls to prove files arent' there)
git checkout master
(ls to show files have been restored)
git checkout new_branch
(ls to show files are gone again)
6 голосов
/ 17 декабря 2011

Commited изменения в одной ветви не влияют на другую ветку.Вам также необходимо зафиксировать все удаления, это то, что Доминик пытался объяснить.Просто сделайте:

$ git co $NEWBRANCH
$ git status

И вы увидите миллионы незафиксированных удалений.Вы должны использовать git rm для удаления файлов.
Не уверен, что git add --all также будет обрабатывать удаления.В любом случае, это IMO не лучший способ начать заново, так как новая ветвь все еще будет иметь старую историю.

Я думаю, что лучше создать новый "недействительный" коммит:

  1. Создание нового репо: mkdir $DIR; cd $DIR; git init
  2. Создание исходного коммита.touch README; git add --all; git commit -m "Init"

Теперь перейдите к исходному репо и:

  1. Добавьте его в качестве удаленного: git remote add start-anew $DIR/.git
  2. получите: git fetch start-anew
  3. выдвиньте его: git co -b start-anew start-anew/master

И вуаля ветка со свежей пустой историей.

Затем вы можете удалить пульт, а также изменитьпульт для ветки.Я обычно редактирую .git/config вручную, пока без происшествий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...