Копирование неотслеживаемой папки в другую ветку

Есть ли способ скопировать неотслеживаемую папку в другую ветку?

Я знаю, что вы можете скопировать отслеженные папки в другую ветку, выполнив что-то вроде этого:

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
Другие вопросы по тегам