67

Git内のいくつかのファイルに加えられた小さな変更を「非表示」にして、それらのファイルに別の変更が加えられるまでgitステータスに表示されないようにする方法を探しています。

例:未使用のインポートを削除することだけが変更されたJavaファイルがあります(寄稿者はコミットする前にインポートの整理を実行するのを忘れていました)。今、私はそのインポートを削除しました、そして、変更は(明らかに)gitに現れます。そのファイルに加える変更は他にないので、別の(無関係な)変更の一部としてファイルをコミットしたり、この変更をスタンドアロンでコミットしたりするのはあまり好きではありません。もちろん、変更を元に戻して、そのファイルに変更を加える必要がある場合にのみ適用することはできますが、それを忘れる「リスク」はあります。

そのようなタスクのためのコマンドは存在しますか?これは、変更されていない仮定コマンドのように機能しますが、永続的な方法ではありません。

そのようなコマンドが利用できない場合、これを解決する適切な方法は何でしょうか?

前もって感謝します。

4

6 に答える 6

102

私のユースケース(個人のマシンで編集された構成ファイルを使用して開発し、構成が変更されていない別のマシンで実行されている)では、これが解決策でした。

ファイルへの変更を無視し始めます。

git update-index --assume-unchanged path/to/file

再び追跡し続ける:

git update-index --no-assume-unchanged path/to/file
于 2014-10-24T14:07:42.590 に答える
4

些細な変更を追加しないでください。

コミットする前に、追加するものを注意深く確認することをお勧めします。

ファイル内の一部の変更を無視して、他の変更を追加することもできます。

git add -p.

gitx(R)を使用すると、これはさらに簡単になります。

于 2013-02-11T16:35:05.440 に答える
3

準備ができていない変更は別のブランチに保管してください。git rebaseこのブランチは、必要に応じてメイン履歴の新しい変更の上にあります。

進行中の開発であれ、一時的なものであれ、メインのプロジェクト履歴に含まれることのないものであれ、同じプロセスが同じようにうまく機能します。

ブランチの変更をメイン履歴に含める準備ができている場合/いつ。マージします。そうでない場合は、それらを別のブランチに保持し、リベースを続行します。

(補足:git merge --no-ff早送りマージが可能な場合でも、マージコミットを作成するのに役立つ場合があります-プロジェクトのルールによっては、これが望ましい場合があります)

于 2013-02-11T15:04:55.457 に答える
3

使用することの欠点git update-index --assume-unchangedは、(gitのマニュアルに記載されているように)ファイルを変更しないことをgitに約束していることです。

「変更なしと見なす」ビットがオンの場合、ユーザーはファイルを変更しないことを約束し、作業ツリーファイルがインデックスに記録されているものと一致するとGitに想定させます。

この約束に違反し、とにかくファイルを変更すると、望ましくない結果が生じる可能性があります。たとえば、一部の実装では、aを実行するgit stashと、ファイルに加えた変更が破棄されます(ファイルを変更しないと約束した場合は、なぜそうすべきではないのですか?)。

代わりに--skip-worktreeオプションを使用すると、動作中のバージョンがインデックスバージョンで最新であるかのようにgitに指示されます。

エントリを読み取るときに、skip-worktreeとしてマークされている場合、Gitは作業ディレクトリのバージョンが最新であると偽って、代わりにインデックスバージョンを読み取ります。

これは、一部のgitコマンドが変更を破棄するリスクなしに、変更を無視するためのより信頼性の高い方法のようです。

git update-index --skip-worktree path/to/file

ファイルを再度追跡するには:

git update-index --no-skip-worktree path/to/file

設定したファイルを一覧表示するにはskip-worktree

git ls-files -v | grep ^S
于 2021-03-02T14:03:04.273 に答える
1

ここにすべての回答を追加して、私の生活を少し快適にするコードを追加しました。BSD coreutils(MacOSのように)を期待します。

git-overlook

#!/usr/bin/env bash

path="$1"
root="$(git rev-parse --show-toplevel)"

if [ -z "$path" ]; then
  echo "Specify a path" 1>&2
  exit 1;
fi;

if [ ! -d .git/overlook ]; then
    mkdir $root/.git/overlook
fi;
record="$root/.git/overlook/$(echo $path | sed 's/\./___/g' | sed 's/\//____/g')"
touch "$record"
git update-index --skip-worktree "$path"

git-relook

#!/usr/bin/env bash

path="$1"
root="$(git rev-parse --show-toplevel)"

record="$root/.git/overlook/$(echo $path | sed 's/\./___/g' | sed 's/\//____/g')"
if [ -f "$record" ]; then
  git update-index --no-skip-worktree "$path"
  rm "$record"
fi;

そして最後に.git/hooks/pre-commit

#!/bin/bash

set -eu

root="$(git rev-parse --show-toplevel)"

get_record_name() {
  record="$root/.git/overlook/$(echo $1 | sed 's/\./___/g' | sed 's/\//____/g')"
  echo "$record"
}

for file in $(git ls-files -v | grep ^S | sed 's/S //'); do
  record="$(get_record_name $file)"
  record_mtime="$(stat -f %m $record)"
  file_mtime="$(stat -f %m $file)"

  if [ "$record_mtime" -lt "$file_mtime" ]; then
    echo "File $file is overlooked but has been modified since. Please run either git overlook $file or git relook $file" 1>&2
    exit 1
  else
    echo "File $file is overlooked but hasn't been modified"
  fi;

done;

これにより、実行できるようにgit overlook path/to/fileなり、見落とされたファイルを変更するまで、陽気な方法でコミットすることができます。変更した時点で、もう一度見落とすか、で戻す必要がありgit relook path/to/fileます。明らかに、見落とされたファイルが私が行った唯一の変更であり、それがに表示されない場合は役に立ちませんgit status

それはものを追跡するためにいくつかのファイルを作成しますが.git/overlook、私が知る限りgit、それらと平和的に共存します。

于 2021-11-23T03:39:25.213 に答える
0

複数の方法があります[ただし、清潔できれいではない可能性があり、注意が必要です]

  1. 関係するファイルをリポジトリに追加し.gitignoreて、コミットに表示されないようにします。.gitignoreファイルをコミットする準備ができたら、これを削除するように注意してください
  2. 残りの変更をコミットしている間は、ファイルを「ステージング」しないでください。問題のファイルを除くすべてのコマンドのようなコマンドまたは実行さgitれるコマンドを確実にするラッパーを作成することをお勧めします。もう1つの方法は、ファイルが「ステージングされた」領域になく、したがってコミットされないことを視覚的に確認できる場所を使用することです。git commit -agit add .git guigit citool
  3. もう1つの方法は、すべての「コミット可能な」変更をコミットしてからgit stash save、唯一の作業ファイルをコミットすることです。後でファイルを変更する準備ができたら、git stash pop作業とコミットを続行できます。

お役に立てば幸いです:)

于 2012-11-18T16:55:39.837 に答える