Инструмент командной строки, чтобы проверить, есть ли в 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"