Git — фиксация и отправка одного и того же репозитория с двух разных машин с разными папками

#git

Вопрос:

У меня есть следующая структура папок:

 AllMyWork/
  --.git/
  --Proj1/
     file1.cpp, ..., file10.cpp
  --WindowsOnly/ (this subfolder does not exist on Linux machine)
     filea.bat
  --LinuxOnly/ (this subfolder does not exist on Windows machine)
     fileb.sh
 

Я чередую работу Proj1 с компьютера под управлением Windows и компьютера под управлением Linux. Обе машины используют одну и ту же структуру файлов/папок с точки зрения .git/ и Proj1/ и ее содержимого file1.cpp file10.cpp . Однако они не предоставляют общий доступ к вложенным WindowsOnly/ папкам и связанному файлу filea.bat (это доступно только на компьютере с Windows), а также вложенным LinuxOnly/ папкам и связанному файлу fileb.sh (это доступно только на компьютере с Linux).

Теперь я сделал фиксацию / толчок с компьютера Windows. Когда я открываю компьютер с Linux и выполняю команду git status , я получаю:

deleted: WindowsOnly/filea.bat

Это понятно, так как Git считает, что этот файл был удален, так как эта папка не существует на компьютере Linux.

Однако что произойдет теперь, если я буду работать с общими файлами в Proj1 и фиксировать / нажимать с компьютера Linux? В следующий раз, когда я открою компьютер с Windows, будет ли вложенная WindowsOnly/ filea.bat папка удалена с компьютера с Windows, так как последний толчок с компьютера с Linux не включал эти файлы?

ETA: Как на компьютере с Windows, так и на компьютере с Linux появилась одна и та же .git/ Proj1/ папка и заключается в том, что на каждой машине я запускаю GoogleDrive/Insync, который автоматически синхронизирует эти папки. На компьютере с Linux я специально инструктирую GoogleDrive/Insync не загружать и не синхронизировать WindowsOnly/ , а на компьютере с Windows я специально инструктирую GoogleDrive/Insync не загружать и не синхронизировать LinuxOnly/ .

Комментарии:

1. Вам придется зафиксировать удаление, чтобы файлы были удалены при извлечении.

2. Я обычно предлагаю первую главу Pro Git, чтобы лучше понять эти концепции; git-scm.com/book/en/v2/Getting-Started-About-Version-Control .

3. @Адам, похоже, что с компьютера Linux я буду постоянно видеть, как удаляются эти файлы, и я должен быть осторожен, чтобы не зафиксировать их удаление. Другой альтернативой является ненужная репликация обеих папок WindowsOnly/ и LinuxOnly/ на обеих машинах.

Ответ №1:

Я бы не сказал, что без необходимости. Эти файлы нужны вам для поддержки проекта на обеих платформах. Это не похоже на то, что linux (проект ядра) имеет разные ветви/репозитории для поддержки количества поддерживаемых ими архитектур. Это единый проект со всеми архитектурами на одной пластине.

На всякий случай, чтобы осуществить это, я бы сделал так, чтобы у меня была общая ветвь (скажем, main ) Proj1 , а затем windows ветвь и linux ветвь, созданные из main них . Ветвь Windows-это место, где вы взламываете WindowsOnly материалы (это единственная ветвь, в которой хранится этот каталог), а затем в linux ветви, которую вы держите LinuxOnly .

Вы даже можете зайти так далеко, чтобы создать linux ветвь из windows ветви (или наоборот) (обязательно удалив файлы из другой архитектуры), просто чтобы git мог видеть связь между файлами (если таковые имеются). Это может немного облегчить задачу, когда вы хотите выбрать изменения от одной архитектуры к другой, но вы как бы погружаетесь в более глубокие воды, если хотите попробовать этот трюк (это выполнимо…. но вам нужно иметь более высокий уровень git-дзен, чтобы понять, почему git так или иначе будет жаловаться при попытке перемещаться между двумя ветвями архитектуры).

Комментарии:

1. Я проводил некоторые исследования, чтобы выяснить, допускает ли .gitignore условия (как это делает .vimrc), но это кажется невозможным. Это могло бы быть выходом, если бы каким-то образом выполнить запрос в ОС. По вашему предложению, всякий раз, когда я работаю на машине linux/Windows, я полагаю, что буду работать над одной ветвью, которая не «видит» другую ветвь. Я попробую это сделать. Я согласен с вами, что я мог бы быть более осторожным в использовании этого слова без необходимости . Эти файлы не слишком велики. Для обеспечения согласованности и простоты использования (чтобы избежать ветвей), возможно, разумно иметь одинаковые папки на каждой платформе.

2. Если вы пойдете по пути использования linux и windows ветвей, то при переключении на каждую из этих двух ветвей вы не увидите файлы из другой архитектуры. Как я понимаю, если вы вернетесь main , вы не увидите ни одного файла ни одной архитектуры, просто Proj1 .

3. Если бы это был я, я бы просто имел все везде и не утруждал себя попытками отфильтровать разные вещи в определенных отраслях. В крупных репозиториях и больших командах будут сотни или даже тысячи проектов и папок, копии которых есть у каждого в их локальном репозитории, даже если они сосредоточены только на небольшом количестве проектов, над которыми они работают. До тех пор, пока пространство на диске не является проблемой, нормально иметь большие части репо «без необходимости» на каждой машине с копией репо. 😉

4. @TTT Иногда также полезно посмотреть, как что-то делается в «другой системе». Является ли поведение вашей операционной системы ошибкой? Ну, если версия Windows ведет себя по-другому, и там есть комментарий, в котором говорится «все еще нужно исправить версию Linux» , и ваше поведение в версии Linux кажется неправильным, теперь вы можете быть уверены, что это неправильно. 😀 (хотя, как и человек с двумя часами, вы никогда не знаете , который час…)