Инструмент командной строки, чтобы проверить, есть ли в git-репозиториях незафиксированный код?

Есть ли инструмент командной строки, который может рекурсивно просматривать каталог для всех репозиториев.git и проверять незафиксированный код? Сценарий использования: у меня есть машина на работе и одна дома, и иногда я забываю отправить код на Github, прежде чем вернуться домой после работы. Существует ли такой инструмент, который может это сделать? Возможно, сам мерзавец может сделать это?

Я мог бы хотеть написать что-то подобное для развлечения - кто-нибудь знает, как проверить репозиторий.git на предмет незафиксированного кода? Я предполагал, что смогу выполнить команду git и каким-то образом собрать результаты.

4 ответа

Давайте объясним, как работает git (в общем).

У Git есть нечто, называемое 3 состояниями.
Эти 3 состояния - очень простая часть мерзавца, и сделанные вами изменения отражаются в этой структуре.


3 states

Чтобы упростить это, посмотрите на это так:
В каждом проекте у вас есть 1 каждого.

  • Рабочий каталог - это ваша файловая система, в которой вы написали свой код.
  • В области отслеживания вы добавляете свои файлы перед их передачей.
  • Репозиторий - это место, где вы фиксируете и сохраняете все свои изменения,

Как упоминалось ранее, у каждого проекта есть по 1 каждому, и в результате каждый раз, когда вы переключаетесь на другую ветвь, весь контент из рабочей директории и стадии "перемещается" и будет появляться в каждой ветке, пока вы не подтвердите это.

Поэтому, как только мы поймем, что происходит, ответ на ваш вопрос прост:

Вам необходимо выяснить, какой контент еще не зафиксирован. Вы делаете это с помощью команды git status.


git status

git status --s

дает вам что-то вроде

M includes/angular/settingsCtrl.js
M index.php
M templates/views/settings/profile.php
?? vendor/apache/

Какие все новые / измененные файлы в вашем текущем рабочем каталоге

Вы можете передать эти результаты в git add, запустить git commit, затем git push.

Вы должны быть в состоянии сделать это с помощью сценария оболочки

У меня была та же проблема / требование и в итоге я использовал https://github.com/eapen/uncommitted, что очень хорошо работает.

Конечно, написание сценария, о котором вы и другие упоминали, было бы простым и отличным учебным упражнением!

Сценарий оболочки ниже, чтобы перечислить репозитории с изменениями, тайниками и фиксациями, отсутствующими в удаленном.

Обратите внимание, что это пропускает подмодули и голые репозитории, чтобы включить их, изменитеfindкоманда за ответ на этот вопрос .

      #!/usr/bin/env bash

# Usage:
# - Save this file as e.g. find-repos.sh
# - Give execute permissions with `chmod +x find-repos.sh`
# - Run the script with optional path to repos (default to current directory), e.g. `./find-repos.sh ~/my-projects`

# Store current working directory to switch back to later on
PWD_PATH=$(pwd)

# Fetch source path to scan from argument, if unset use current directory
SOURCE_PATH="${1:-$PWD_PATH}"

# Ensure ~ is expanded to an absolute path
PATH_TO_SCAN=$(eval echo "${SOURCE_PATH}")

echo "Scanning for repos with changes and stashes in ${PATH_TO_SCAN}"

# Set up counters
REPO_COUNT=0
REPO_WITH_CHANGES_COUNT=0

# Loop through all directories and check git
for GIT_DIRECTORY in $(find "${PATH_TO_SCAN}" -type d -name '*.git');
do
  REPO_DIRECTORY=$(dirname "${GIT_DIRECTORY}")

  # Change in to directory
  cd ${REPO_DIRECTORY}

  # Check for any modified or untracked files
  GIT_STATUS=$(git status --porcelain)
  if [ -n "$GIT_STATUS" ]; then
    echo "Found changes in repo: ${REPO_DIRECTORY}"
    echo "$GIT_STATUS"
    ((REPO_WITH_CHANGES_COUNT++))
    echo "---"
  fi

  # Check for any stashes
  GIT_STASH_LIST=$(git stash list)
  if [ -n "$GIT_STASH_LIST" ]; then
    echo "Found stashes in repo: ${REPO_DIRECTORY}"
    echo "$GIT_STASH_LIST"
    ((REPO_WITH_CHANGES_COUNT++))
    echo "---"
  fi

  # Check for branches not in remote
  GIT_BRANCHES_NOT_REMOTE=$(git log --oneline --branches --not --remotes)
  if [ -n "$GIT_BRANCHES_NOT_REMOTE" ]; then
    echo "Found local commits not available in remote: ${REPO_DIRECTORY}"
    echo "$GIT_BRANCHES_NOT_REMOTE"
    ((REPO_WITH_CHANGES_COUNT++))
    echo "---"
  fi

  ((REPO_COUNT++))
done

# Change back to original working directory
cd "${PWD_PATH}"

# Print summary
echo "Processed ${REPO_COUNT} repos, ${REPO_WITH_CHANGES_COUNT} repos to review"
Другие вопросы по тегам