Копирование неотслеживаемой папки в другую ветку
Есть ли способ скопировать неотслеживаемую папку в другую ветку?
Я знаю, что вы можете скопировать отслеженные папки в другую ветку, выполнив что-то вроде этого:
git checkout mybranch
git checkout master -- myfolder
Но есть ли способ скопировать папку, которая не отслеживается на главном сервере, но отслеживается в ветви, в которую я хочу скопировать?
Я пытаюсь сделать это для страниц GitHub, и я следую этому руководству, но он берет на себя обязательство освоить и толкает его на верхние gh-страницы. Я не хочу этого делать. Я просто хочу, чтобы моя сборка генерировала документы и копировала неотслеживаемые документы в другую ветку, а затем отправляла их вверх по течению.
3 ответа
Здесь у вас есть ситуация, когда у вас есть неотслеживаемые файлы, которые конфликтуют с отслеживаемыми файлами в другой ветке. Вы хотели бы переключиться на эту ветку, но checkout
не позволю тебе.
Решение "первого уровня" в git заключается в продвижении этих неотслеживаемых файлов в индекс:
git add folder
Теперь вы все еще не можете проверить в филиале. Однако вам предоставляется новая возможность: вы можете git stash save
перемены:
git stash save
Теперь вы можете переключиться на ветку и сделать git stash pop
, На этом этапе вы можете иметь дело с конфликтами слияния, если таковые имеются, а затем git reset
и вы сделали.
[Обновление: git add
не нужно, потому что git stash
имеет возможность включить неотслеживаемые файлы!]
Давайте поработаем над полным примером, включающим один файл с именем topicfile
который существует только в ветке, и создается как рабочий файл, в то время как на master
, но с другим содержанием:
~$ mkdir gittest
~$ cd gittest/
~/gittest$ git init
Initialized empty Git repository in /home/kaz/gittest/.git/
~/gittest$ touch emptyfile
~/gittest$ git add emptyfile
~/gittest$ git commit -m "starting repo"
[master (root-commit) 75ea7cd] starting repo
0 files changed
create mode 100644 emptyfile
~/gittest$ git branch
* master
~/gittest$ git checkout -b topic
Switched to a new branch 'topic'
~/gittest$ cat > topicfile
a
b
c
d
e
~/gittest$ git add topicfile
~/gittest$ git commit -m "topicfile"
[topic 875efc5] topicfile
1 file changed, 5 insertions(+)
create mode 100644 topicfile
~/gittest$ git checkout master
Switched to branch 'master'
~/gittest$ ls
emptyfile
~/gittest$ cat > topicfile
@
a
b
c
d
e
f
g
h
~/gittest$ git add topicfile
~/gittest$ git stash save topicfile
Saved working directory and index state On master: topicfile
HEAD is now at 75ea7cd starting repo
~/gittest$ git checkout topic
Switched to branch 'topic'
~/gittest$ git stash pop
Auto-merging topicfile
CONFLICT (add/add): Merge conflict in topicfile
~/gittest$ cat topicfile
<<<<<<< Updated upstream
=======
@
>>>>>>> Stashed changes
a
b
c
d
e
<<<<<<< Updated upstream
=======
f
g
h
>>>>>>> Stashed changes
~/gittest$ cat > topicfile # resolve in favor of stashed changes:
@
a
b
c
d
e
f
g
h
~/gittest$ git add topicfile
~/gittest$ git reset
Unstaged changes after reset:
M topicfile
~/gittest$ git diff
diff --git a/topicfile b/topicfile
index 9405325..bea0ebb 100644
--- a/topicfile
+++ b/topicfile
@@ -1,5 +1,9 @@
+@
a
b
c
d
e
+f
+g
+h
На данный момент мы можем совершить наш topicfile
изменения в topic
ветка, а файл еще не отслеживается master
,
Потому что были конфликты в git stash pop
Тайник все еще существует. Мы можем убрать это с git stash drop
,
Альтернативой всему этому является не только git add
неотслеживаемые файлы в индекс, но для git commit
чтобы сделать правильный коммит. Тогда мы можем выбрать вишню в ветке. Если мы не хотим, чтобы эти файлы отслеживались master
это нормально: мы можем позже git reset --hard HEAD^
на мастера, чтобы устранить этот коммит.
Если папка не отслежена, то вы можете просто checkout
другая ветка и неотслеживаемый каталог не затрагиваются.
Если вы оказались здесь, потому что пытаетесь отправить документацию Sphinx из неотслеживаемой папки docs/_build в ветку gh-pages, вот что я сделал в своем действии на GitHub.
- name: Init new repo in dist folder and commit generated files
run: |
cd docs/build/html/
git init
touch .nojekyll
git add -A
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git commit -m 'deploy'
- name: Force push to destination branch
uses: ad-m/github-push-action@v0.5.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: gh-pages
force: true
directory: ./docs/build/html
Это делает что-то подобное, если бы я работал на своем локальном компьютере.
cd docs/_build/html/
#git init #run first time only
#touch .nojekyll #run first time only
git add -A
git commit -m 'deploy'
git push -f <url of the repo on GitHub> master:gh-pages
cd ../../..
git fetch --all
git checkout gh-pages # now update the local gh-pages branch
git pull
В первый раз Git пожаловался, что истории origin/gh-pages и local/gh-pages несовместимы, поэтому я сделал это. Я сделал резервную копию gh-страниц, так как всегда немного боюсьgit reset --hard
git branch backup-ghp
git reset --hard origin/gh-pages