У меня есть каталог A с файлами, соответствующими каталогу B. Каталог A может иметь другие необходимые файлы. Каталог B - это репозиторий git.
Я хочу клонировать каталог B в каталог A, но git -clone не позволит мне, так как каталог не пуст.
Я надеялся, что он просто клонирует .git, и поскольку все файлы совпадают, я мог бы оттуда?
Я не могу клонировать в пустой каталог, потому что у меня есть файлы в каталоге A, которые не находятся в каталоге B, и я хочу их сохранить.
Копирование .git не является вариантом, так как я хочу, чтобы refs нажимал/тянул, и я не хочу их вручную настраивать.
Есть ли способ сделать это?
Обновление: я думаю, что это работает, может ли кто-нибудь увидеть какие-либо проблемы? →
cd a
git clone --no-hardlinks --no-checkout ../b a.tmp
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this
Ответ 1
В следующих командах оболочки existing-dir
- это каталог, содержимое которого соответствует отслеживаемым файлам в репозитории repo-to-clone
git.
# Clone just the repository .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo
# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/
# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir
# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD
Ответ 2
Это сработало для меня:
git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master
ПРИМЕЧАНИЕ: -t
установит ветвь для вас, если это то, что вы хотите, и обычно это так.
Ответ 3
Небольшая модификация одного из ответов, которые работали для меня:
git init
git remote add origin PATH/TO/REPO
git pull origin master
чтобы сразу начать работать с ведущей веткой.
Ответ 4
Вот что я в итоге сделал, когда у меня была такая же проблема (по крайней мере, я думаю, что та же проблема). Я зашел в каталог A и запустил git init
.
Так как я не хотел, чтобы файлы в каталоге A сопровождались git, я отредактировал .gitignore и добавил к нему существующие файлы. После этого я побежал git remote add origin '<url>' && git pull origin master
et vo'la, B "клонировал" в без единого икота.
Ответ 5
Предупреждение - это может перезаписать файлы.
git init
git remote add origin PATH/TO/REPO
git fetch
git checkout -t origin/master -f
Изменено с @cmcginty answer - без -f у меня это не сработало
Ответ 6
Это сработало для меня:
cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master
Ответ 7
Другой простой рецепт, похоже, хорошо работает для меня:
git clone --bare $URL .git
git config core.bare false
Мой основной вариант использования для проверки в каталоге с существующими файлами - это управлять моими файлами Unix с помощью Git. В новой учетной записи в домашнем каталоге уже есть некоторые файлы, возможно, даже те, которые я хочу получить из Git.
Ответ 8
Я использовал это несколько минут назад, требуя наименее потенциально разрушительных команд:
cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git reset
И воля!
Ответ 9
Может быть, я неправильно понял ваш вопрос, но не проще ли скопировать/переместить файлы из A в git repo B и добавить нужные с помощью git add?
ОБНОВЛЕНИЕ: Из Git Doc:
Клонирование в существующий каталог допускается только в том случае, если каталог пуст.
ИСТОЧНИК: http://git-scm.com/docs/git-clone
Ответ 10
Я искал что-то подобное, и вот что я придумал:
Моя ситуация такова, что у меня есть активное веб-дерево, и я пытался создать для него удаленный репозиторий, не перемещая ни одного из файлов в текущем веб-дереве. Вот что я сделал:
- Перейдите в веб-дерево и запустите
git init
- Перейдите в предполагаемое местоположение репозитория и запустите:
git clone --bare /path/to/web/repo
- Отредактируйте конфигурационный файл в удаленном репо и удалите раздел
[remote "origin"]
.
- Добавьте раздел
[remote "origin"]
в .git/config в веб-дереве, указав на новое дистанционное репо.
Ответ 11
это работа для меня, но вы должны объединить файлы удаленных репозиториев в локальные файлы:
git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status
Ответ 12
Вот что я делаю:
git clone repo /tmp/folder
cp -rf /tmp/folder/.git /dest/folder/
cd /dest/folder
git checkout -f master
Ответ 13
У меня была похожая проблема с новым веб-каталогом Apache (учетная запись, созданная с помощью WHM), которую я планировал использовать в качестве промежуточного веб-сервера. Сначала мне нужно было клонировать мой новый проект с базой кода и периодически вносить изменения, извлекая данные из репозитория.
Проблема заключалась в том, что учетная запись уже содержала файлы веб-сервера, такие как:
.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...
... что я не хотел ни удалять, ни фиксировать в своем хранилище. Мне нужно было, чтобы они оставались там без посторонних и неотслеживаемых.
Что я сделал:
Я зашел в свою веб-папку (существующая_фолдер):
cd /home/existing_folder
а затем:
git init
git remote add origin PATH/TO/REPO
git pull origin master
git status
В нем отображался (как и ожидалось) список многих не подготовленных файлов - тех, которые изначально существовали в моей учетной записи cPanel.
Затем, благодаря этой статье, я просто добавил список этих файлов в:
**.git/info/exclude**
Этот файл, почти как файл .gitignore
, позволяет игнорировать файлы, находящиеся в стадии подготовки. После этого мне нечего было делать в каталоге .git / - он работает как личный .gitignore
, который никто не может увидеть.
Теперь проверка git status
возвращает:
On branch master
nothing to commit, working tree clean
Теперь я могу развернуть изменения на этом веб-сервере, просто извлекая их из своего git-репозитория. Надеюсь, что это поможет некоторым веб-разработчикам легко создать промежуточный сервер.
Ответ 14
Мне понравился ответ Дейла, и я также добавил
git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp
git branch dev_new214
git checkout dev_new214
git add .
git commit
git checkout dev
git merge dev_new214
Малая глубина избежала множества дополнительных ранних изменений. Новая ветка дала нам хорошую визуальную историю, что был добавлен новый код с этого сервера. На мой взгляд, это идеальное использование веток. Спасибо большое за понимание всех людей, которые разместили здесь.