tldr:gitmeoutofhere

tldr:gitmeoutofhere

Linuxでどのファイルの内容が変更または追加されたかを確認する方法はありますか?私はatime、ctime、mtimeを知っています。私は "myscript.sh"スクリプトを生成しましたが、誰かがコードのいくつかの行を追加または削除するなど、その中で何かを変更したとしましょう。ファイルが生成された後に何が変更されたかを知りたいです。

どんなアイデアがありますか?

答え1

VCSを介してこれを行うことができます。。まず、Debianシステム用の
gitをインストールします(事前にインストールされている必要があり、そうでない場合はパッケージマネージャに存在する必要があります)。次に、そのディレクトリにファイル()を保存するディレクトリを作成し、それを実行します(これによりローカルが作成されます。Gitリポジトリ)。ファイルをディレクトリに追加してを実行すると、ファイルをそのまま保存できます。実行してファイルが編集されていることを確認できます。次のような内容が表示されます。
sudo apt-get install git
mkdir myDir
git init
git add -f *
git commit -m "file before editing"
git status

modified: myFile.txt

ファイルを最後に実行した時点にロールバックするには、次のようにgit commit実行しますgit reset --hard HEAD^。これにより、ローカルストアが最後のコミットに戻ります。

以下を使用して、ファイルに新しい変更を保存できますgit commit

git commit -m "added 4 lines"

コミット(および対応するメッセージ)のリストを表示するには、次を実行しますgit log


VCSはこの目的のために設計されているため、回答にVCSを使用してください。

答え2

通常、Unixにはツールが組み込まれていません(または、Unixなどの最も一般的なファイルシステムにはツールは組み込まれていません)。OpenVMSにある/あり)、したがって、以前のバージョンのファイルを検索することはできません。

最も簡単な解決策は、「監視」したいファイルの個人コピーをアーカイブしてから、システムにインストールされているコピーと一緒にdiff定期的に実行することです。

次のステップは、ある種のバージョン管理システムにファイルを保存することです。 Unixを使用する最も簡単な方法は通常RCSこれは非常に基本的ですが、コメントに記載されているように行われます。

より複雑ですが、1つまたは複数のファイルのみが関連している場合は、面倒になる可能性があります(RCSは個々のファイルを処理し、一緒に属する多くのファイルの「ストレージ」の概念を持っていません)。

答え3

@SahibPrimeの回答に対するあなたの意見に基づいて、以下を使用する必要があります。マネージャーをお待ちください

ホームページから:

etckeeper/etcgitまたはmercurialリポジトリに保存できるbazaarツールバーですdarcs。これにより、gitを使用して/ etcへの変更を表示または元に戻すことができます。あるいは、バックアップまたはオプションの構成変更のためにリポジトリを別の場所にプッシュすることもできます。

たとえば、パッケージのアップグレード中に変更がapt自動的にコミットされるようにパッケージマネージャに接続されます。/etcgitは通常サポートしていませんが、/etc/shadowに対する権限など、/ etcに重要なファイルメタデータを追跡します。

バージョン管理の基本を知っていれば、非常にモジュラーで構成可能で使いやすくなります。

SahibPrimeが言及していないことの1つは、これを使用して、git diff現在および/または以前にコミットされたバージョン間にどのような変更が適用されたか、その変更がいつ適用されたかを確認できることです。また、リビジョン制御ファイルの以前のバージョンに簡単に戻すこともできます。

少なくとも Debian では cron で毎日実行されるので、変更をコミットすることを覚えておく必要さえありません。他のディストリビューションでもcronで実行されることはほぼ確実です。

インストールして必要になるまで完全に忘れてください。メンテナンスは不要です。

git(または他の同様のソフトウェア)を使用して/ usr / localの変更を追跡することもできます。私は/etcや/usr/local/{s、}bin/、〜/binなどのディレクトリで長年RCSを使用してきました。後でそれに変えたらsvnもっと良くetckeeperなりましたねgit


tldr:gitmeoutofhere

apt2012年にetckeeperに切り替えたようです。それ以来、私はすべての変更の改訂履歴を持っています(少なくとも毎日、インストールまたはアップグレードの前後)。

# git log | tail -5 
commit 7e3bb0eade7ae9e211bb684be2e3c7d4a3128c24
Author: ...my.email.address.deleted...
Date:   Wed Feb 29 12:53:30 2012 +1100

    Initial commit

# git log | grep '^commit' | wc -l
1378

見たり考えたり、存在することを覚えておく必要もほとんどありませんが、必要なときはすぐそこにあります。とても楽しい。私が犯した愚かなことをキャンセルし、すべてのプロファイルのうまく動作し、良いバージョンをすぐに復元することができます。

構成ファイルのすべてのリビジョン履歴に対して実行できる操作は次のとおりです。

特定のファイルのコミットリストを表示できます。

# git log apache2/apache2.conf | sed -ne 's/commit //p'  | head
2d0fabf90f2bc639d30bca925147fafd3fbd5e50
8022c7ca6dbe1661064604a646c52ca0d1f1b3ac
0620c88b8d1fd625f74f42059a4e8f056846df16
8c2fcfef72eca034b251654be44a268e92e39416
02329cf86655a2bb2c09c793b1d195a4de579cf1
5e449105f0ab75f9e903d8c75af5c8db6543c281
d8339212967af2c664b0c1776e9352f6c0e12ff8
7e3bb0eade7ae9e211bb684be2e3c7d4a3128c24

これらのコミットがいつ発生するかを確認できます。

# git log 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac | head -5
commit 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac
Author: ...
Date:   Tue Aug 20 12:26:53 2013 +1000

    committing changes in /etc after apt run

違いを見ることができます。

# git diff 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac apache2/apache2.conf
diff --git a/apache2/apache2.conf b/apache2/apache2.conf
index baf6d8a..617152c 100644
--- a/apache2/apache2.conf
+++ b/apache2/apache2.conf
@@ -71,7 +71,7 @@
 #
 # The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
 #
-Mutex file:${APACHE_LOCK_DIR} default
+#Mutex file:${APACHE_LOCK_DIR} default

 #
 # PidFile: The file in which the server should record its process

一部および/またはすべてのコンテンツを以前のバージョンに戻すことができます。最も便利な方法は、個々のファイルを回復することです。

# git checkout 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac apache2/apache2.conf
# git diff 8022c7ca6dbe1661064604a646c52ca0d1f1b3ac apache2/apache2.conf
#

最後のコミット以降に変更されたファイルのリストを表示できます。

# git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   apache2/apache2.conf

no changes added to commit (use "git add" and/or "git commit -a")

必要に応じて再コミット(git addまたは使用git commit)を変更して最新のコミットを再インポートできます。

# git checkout 2d0fabf90f2bc639d30bca925147fafd3fbd5e50 apache2/apache2.conf
# git help status
# 

答え4

侵入検知システム(IDS)を探しています。一部のIDSは定期的にシステム上のすべてのファイルを確認し、予期しない変更がある場合に警告します。一般的な例は次のとおりですtripwire。しかし、引き続き403が表示されます。tripwire.org過去8時間。

これらのシステムは通常ファイルのチェックサムだけを覚えているため、変更内容を理解するにはバックアップと比較する必要があります。

関連情報