인덱스가 작업 트리의 특정 경로에 있는 파일의 존재 여부를 반영하도록 만듭니다.

인덱스가 작업 트리의 특정 경로에 있는 파일의 존재 여부를 반영하도록 만듭니다.

저장소를 업데이트하고 특정 경로에서 파일을 추가/삭제하는 스크립트가 있습니다. 경로를 알고 이러한 변경 사항을 어떻게 커밋할 수 있습니까? 즉,

  • 지정된 파일이 작업 트리에 있으면 해당 파일을 인덱스에 복사합니다.
  • 지정된 파일이 인덱스에는 있지만 작업 트리에는 없으면 인덱스에서 제거합니다.
  • 지정된 파일이 작업 트리나 인덱스에 없으면 아무 작업도 수행하지 않습니다.

git add마지막 경우에 실패합니다. 명령줄의 경로 중 하나라도 존재하지 않으면 오류와 함께 종료되고 아무 작업도 수행되지 않습니다.

나는 다음을 고려했다:

  • git add --ignore-errors, 안타깝게도 존재하지 않는 파일을 무시하는 오류 종류로 간주하지 않습니다.

  • git add --ignore-missing실망스럽게도 존재하지만 에서만 작동합니다 --dry-run.

  • 오류를 무시하고 경로당 한 번의 git add호출은 작동하지만 속도가 느리고 파일이 존재하지 않아(인덱스나 작업 트리에 없음) 다른 오류로부터 오류를 식별하는 것을 허용하지 않습니다.

  • 한 번의 git add --all호출로는 특정 경로의 파일만 스테이징하는 것이 허용되지 않습니다.

답변1

git add지금까지 내가 찾은 가장 좋은 해결책은 git 인덱스와 작업 트리를 명시적으로 검사하여 전달할 경로 목록을 구성하는 것입니다 .

저장소가 주어지면:

git init .
echo $RANDOM > ignore-edited
echo $RANDOM > ignore-deleted
echo $RANDOM > add-edited
echo $RANDOM > add-deleted
git add .
git commit -m 'Initial commit'

echo $RANDOM > ignore-new
echo $RANDOM > ignore-edited
rm             ignore-deleted
echo $RANDOM > add-new
echo $RANDOM > add-edited
rm             add-deleted

업데이트할 파일 목록:

printf '%s\n' add-new add-edited add-deleted add-nonexistent | sort \
    > /tmp/filelist.txt

추가할 파일과 인덱스의 교차점, 추가할 파일과 작업 트리에 존재하는 파일의 교차점 사이의 합집합을 가져와 파일 목록을 구성할 수 있습니다.

comm -12 /tmp/filelist.txt <(git ls-files) \
    > /tmp/files-in-index.txt
while read -r line ; do test -e "$line" && printf -- '%s\n' "$line" ; done < /tmp/filelist.txt \
    > /tmp/files-in-worktree.txt
sort -um /tmp/files-in-index.txt /tmp/files-in-worktree.txt \
    > /tmp/files-to-add.txt
< /tmp/files-to-add.txt xargs git add

또는 한 번의 호출로 다음을 수행합니다.

sort -um \
    <(comm -12 /tmp/filelist.txt <(git ls-files)) \
    <(while read -r line ; do test -e "$line" && printf -- '%s\n' "$line" ; done < /tmp/filelist.txt) |
    xargs git add

관련 정보