Git管理のファイル名を変更する

ファイル名の変更と、そのファイルを使っているファイル中の文字列の置換です。このブログの電子工作で使っているbreadレポジトリが実験対象です。
今breadのディレクトリ構成は以下のようになっています。

takk@deb83:~/bread$ tree
.
├── bread.sh
├── mcu
│   └── avr
│       ├── attiny2313
│       │   ├── breadboard.sh
│       │   ├── device
│       │   │   ├── 7seg-4digit
│       │   │   │   ├── hello.c
│       │   │   │   └── makefile
│       │   │   ├── a-3880eg
│       │   │   │   ├── hello.c
│       │   │   │   └── makefile
│       │   │   ├── c-7seg
│       │   │   │   ├── hello.c
│       │   │   │   └── makefile
│       │   │   └── tc1602e-13a
│       │   │       ├── breadboard.sh
│       │   │       ├── makefile
│       │   │       └── test.c
│       │   ├── makefile
│       │   └── test.c
│       ├── attiny26
│       │   ├── breadboard.sh
│       │   ├── hello.c
│       │   └── makefile
│       └── attiny85
│           ├── breadboard.sh
│           ├── makefile
│           └── test.c
└── sample.sh

10 directories, 20 files

makefileが存在する各ディレクトリでビルドができるようになっていますが、ソースファイル名が、test.cだったり、hello.cだったりと統一されていません。これをすべてhello.cへ変更したいと思います。

まずは、testという単語を使っているファイルを探します。

takk@deb83:~/bread$ grep -rl test *
mcu/avr/attiny2313/makefile
mcu/avr/attiny2313/device/tc1602e-13a/makefile
mcu/avr/attiny85/makefile
takk@deb83:~/bread$ 

3件見つかりました。
これらのファイルで使っているtestをhelloに置換します。gitで管理しているのでファイルはいつでも戻せます。思い切って置換します。

takk@deb83:~/bread$ sed 's/test/hello/g' -i `!!`
sed 's/test/hello/g' -i `grep -rl test *`
takk@deb83:~/bread$ 

うまく置換できたか、git上でdiffします。

takk@deb83:~/bread$ git diff
diff --git a/mcu/avr/attiny2313/device/tc1602e-13a/makefile b/mcu/avr/attiny2313
/device/tc1602e-13a/makefile
index 39e1efe..159a117 100644
--- a/mcu/avr/attiny2313/device/tc1602e-13a/makefile
+++ b/mcu/avr/attiny2313/device/tc1602e-13a/makefile
@@ -1,11 +1,11 @@
-test: test.c
-       avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o test.o test.c
-       avr-gcc -O2 -mmcu=attiny2313 test.o -o test
-       avr-objcopy -j .text -j .data -O ihex test test.hex
+hello: hello.c
+       avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c
+       avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello
+       avr-objcopy -j .text -j .data -O ihex hello hello.hex

(省略) 
 
-testwrite:
-       avrdude -p t85 -c linuxgpio -U flash:w:test.hex;echo DONE
+hellowrite:
+       avrdude -p t85 -c linuxgpio -U flash:w:hello.hex;echo DONE
 
 clean:
-       rm test.o test.hex test
+       rm hello.o hello.hex hello

一点追加で置換したいものが見つかりました。testwriteがhellowriteになりましたが、ただのwriteに統一したいです。
同じように置換します。

takk@deb83:~/bread$ grep -rl hellowrite *
mcu/avr/attiny2313/makefile
mcu/avr/attiny85/makefile
takk@deb83:~/bread$ sed 's/hellowrite/write/g' -i `!!`
sed 's/hellowrite/write/g' -i `grep -rl hellowrite *`
takk@deb83:~/bread$ 

すべてwriteという単語に変わったか確認します。統一できたようです。

takk@deb83:~/bread$ grep -r write *
mcu/avr/attiny26/makefile:write:
mcu/avr/attiny2313/makefile:write:
mcu/avr/attiny2313/device/a-3880eg/makefile:write:
mcu/avr/attiny2313/device/c-7seg/makefile:write:
mcu/avr/attiny2313/device/tc1602e-13a/makefile:write:
mcu/avr/attiny2313/device/7seg-4digit/makefile:write:
mcu/avr/attiny85/makefile:write:
takk@deb83:~/bread$ 

次に、git管理のファイル名を変更しますが、mvコマンドではなく、git mvを使います。
ファイル名変更の対象であるtest.cを探します。

takk@deb83:~/bread$ find -name test.c
./mcu/avr/attiny2313/test.c
./mcu/avr/attiny2313/device/tc1602e-13a/test.c
./mcu/avr/attiny85/test.c
takk@deb83:~/bread$ 

git mvで置換します。

takk@deb83:~/bread$ for i in `find -name test.c`;do git mv $i ${i//test/hello};done
takk@deb83:~/bread$ 

git statusを見てみましょう。

takk@deb83:~/bread$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	renamed:    mcu/avr/attiny2313/device/tc1602e-13a/test.c -> mcu/avr/attiny2313/device/tc1602e-13a/hello.c
	renamed:    mcu/avr/attiny2313/test.c -> mcu/avr/attiny2313/hello.c
	renamed:    mcu/avr/attiny85/test.c -> mcu/avr/attiny85/hello.c

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:   mcu/avr/attiny2313/device/tc1602e-13a/makefile
	modified:   mcu/avr/attiny2313/makefile
	modified:   mcu/avr/attiny85/makefile

takk@deb83:~/bread$ 

ではまとめてaddします。

takk@deb83:~/bread$ git add *
takk@deb83:~/bread$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	renamed:    mcu/avr/attiny2313/device/tc1602e-13a/test.c -> mcu/avr/attiny2313/device/tc1602e-13a/hello.c
	modified:   mcu/avr/attiny2313/device/tc1602e-13a/makefile
	renamed:    mcu/avr/attiny2313/test.c -> mcu/avr/attiny2313/hello.c
	modified:   mcu/avr/attiny2313/makefile
	renamed:    mcu/avr/attiny85/test.c -> mcu/avr/attiny85/hello.c
	modified:   mcu/avr/attiny85/makefile

takk@deb83:~/bread$ 

コミット。

takk@deb83:~/bread$ git commit
[master 74a0da6] s/test/hello/g
 6 files changed, 20 insertions(+), 20 deletions(-)
 rename mcu/avr/attiny2313/device/tc1602e-13a/{test.c => hello.c} (100%)
 rename mcu/avr/attiny2313/{test.c => hello.c} (100%)
 rename mcu/avr/attiny85/{test.c => hello.c} (100%)
takk@deb83:~/bread$ 

push後、再度cloneして確認します。

takk@deb83:~$ git clone https://github.com/takkete/bread.git
Cloning into 'bread'...
remote: Counting objects: 95, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 95 (delta 2), reused 0 (delta 0), pack-reused 77
Unpacking objects: 100% (95/95), done.
Checking connectivity... done.
takk@deb83:~$ cd bread
takk@deb83:~/bread$ 

treeを確認。

takk@deb83:~/bread$ tree
.
├── bread.sh
├── mcu
│   └── avr
│       ├── attiny2313
│       │   ├── breadboard.sh
│       │   ├── device
│       │   │   ├── 7seg-4digit
│       │   │   │   ├── hello.c
│       │   │   │   └── makefile
│       │   │   ├── a-3880eg
│       │   │   │   ├── hello.c
│       │   │   │   └── makefile
│       │   │   ├── c-7seg
│       │   │   │   ├── hello.c
│       │   │   │   └── makefile
│       │   │   └── tc1602e-13a
│       │   │       ├── breadboard.sh
│       │   │       ├── hello.c
│       │   │       └── makefile
│       │   ├── hello.c
│       │   └── makefile
│       ├── attiny26
│       │   ├── breadboard.sh
│       │   ├── hello.c
│       │   └── makefile
│       └── attiny85
│           ├── breadboard.sh
│           ├── hello.c
│           └── makefile
└── sample.sh

10 directories, 20 files
takk@deb83:~/bread$ 

makefileが存在するディレクトリすべてmakeを実行して確認します。

takk@deb83:~/bread$ for i in `find -name makefile`;do (cd `dirname $i`;make);done
avr-gcc -O2 -mmcu=attiny26 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny26 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
avr-gcc -O2 -mmcu=attiny2313 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny2313 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
avr-gcc -O2 -mmcu=attiny85 -DF_CPU=1000000UL -c -o hello.o hello.c
avr-gcc -O2 -mmcu=attiny85 hello.o -o hello
avr-objcopy -j .text -j .data -O ihex hello hello.hex
takk@deb83:~/bread$ 

成功しました。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA