programing

git로 새 파일의 일부만 스테이징하는 방법은 무엇입니까?

starjava 2023. 7. 1. 07:57
반응형

git로 새 파일의 일부만 스테이징하는 방법은 무엇입니까?

저는 git add -- 대화형좋아합니다.이제는 일상적인 워크플로우의 일부가 되었습니다.

문제는 추적되지 않은 파일에서는 작동하지 않는 것 같습니다.새 파일을 추적하지만 일부만 추가합니다. 즉, 이 새 파일의 일부는 아직 준비되지 않았습니다.

예를 들어 git add-i를 사용하면 패치 옵션을 선택하고 새 코드의 일부를 준비하기 위해 개별 hunk를 편집할 수 있으므로 디버그 코드 주석은 준비되지 않습니다.제가 현재 작업 중인 메가 패치의 어느 곳에서 여전히 작업이 필요한지를 명확하게 해주기 때문에 저는 이런 방식으로 작업하는 것을 좋아합니다.

유감스럽게도 추적되지 않은 파일로는 동일한 작업을 수행할 수 없을 것 같습니다.내가 전체 파일을 준비하든지 아니면 아무것도 준비하지 않든지.사용한 해결 방법은 파일이 비어 있을 때 새 파일을 준비하거나 커밋한 다음 일반적인 방법으로 개별 변경 사항을 준비하는 것입니다.하지만 이 해결책은 더러운 해킹처럼 느껴지고 제가 잊어버리거나 마음을 바꿀 때, 필요 이상으로 많은 문제를 야기합니다.

그래서 질문은 다음과 같습니다.새 파일의 일부만 스테이징하여 이 새 파일을 추적하고 콘텐츠의 전체 또는 일부를 스테이징하지 않도록 하는 방법은 무엇입니까?

와, 그 모든 것들update-index그리고.hash-object사업이 너무 복잡해 보입니다.대신에 이것은 어떻습니까?

git add -N new_file
git add -i  # or 'git add -p' if you prefer

부터git help add:

-N, --intent-to-add
    Record only the fact that the path will be added later.  An entry
    for the path is placed in the index with no content.  This is useful
    for, among other things, showing the unstaged content of such files
    with git diff and committing them with git commit -a.
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

간단한 데모:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • 힌트 '빈' 블롭이 Git 개체 데이터베이스에 이미 있는 것이 확실하면 해시를 하드 코딩할 수 있습니다.e69de29bb2d1d6434b8b29ae775ad8c2e48c5391대신.저는 그렇게 하는 것을 추천하지 않습니다.
  • 힌트 Windows(윈도우)를 사용하는 경우에는NUL:대신에/dev/null그렇지 않으면 다음과 같은 것을 사용합니다.echo -n '' | git hash-object --stdin -w

이제 인덱스는 다음을 포함합니다.newfile빈 블롭으로, 그리고 빈 블롭이 아직 존재하지 않는 경우 오브젝트 데이터베이스에 입력됩니다.

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

이것이 바로 당신이 원하는 것이어야 합니다.매우 지능적인 인덱스 관리를 위해 vim 도망 플러그인도 추천할 수 있습니까(Better git add -p 참조).

이를 위한 가장 쉬운 방법은 (그리고 일반적으로 imho 대화형 스테이징)입니다.git guiGit와 함께 제공되며 Git가 지원하는 거의 모든 플랫폼에서 작동해야 합니다.

단순 실행git gui그리고 hunk를 스테이징 및 스테이징 해제할 수 있는 GUI가 열리고 추적 및 추적되지 않은 파일의 한 줄도 표시됩니다.

Git Gui screenshot

편집: 지금은 작동하지 않는 것 같습니다.(1.7.1 g) 이전이었을 것입니다.안 될 경우를 대비해서 준비를 하는 것이 좋습니다./dev/null그가 위에서 제안한 바와 같이:

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

윈도우)를하지 않는 /dev/null그런 다음 빈 파일의 경로로 바꿀 수 있습니다.

원답

너는 원한다

git add -p # (or --patch)

그러면 추적되지 않은 파일이 추가됩니다.맨 페이지에서:

대화형으로 인덱스와 작업 트리 사이의 패치 덩어리를 선택하여 인덱스에 추가합니다.이렇게 하면 수정된 내용을 색인에 추가하기 전에 사용자가 차이점을 검토할 수 있습니다.

이렇게 하면 add --interactive가 효과적으로 실행되지만 초기 명령 메뉴를 무시하고 패치 하위 명령으로 직접 이동합니다.자세한 내용은 "대화형 모드"를 참조하십시오.

다른 가능성에 대한 기록:사용합니다

git add -N file
git add -p file

그런 다음 헝크를 무대에 올리거나 편집할 수 있습니다.

언급URL : https://stackoverflow.com/questions/6436681/how-to-stage-only-part-of-a-new-file-with-git

반응형