diff --git a/add-interactive.c b/add-interactive.c
index 6bf87e7ae7..58ad10be10 100644
--- a/add-interactive.c
+++ b/add-interactive.c
@@ -233,7 +233,7 @@ struct list_options {
 static void list(struct add_i_state *s, struct string_list *list, int *selected,
 		 struct list_options *opts)
 {
-	int i, last_lf = 0;
+	int last_lf = 0;
 
 	if (!list->nr)
 		return;
@@ -242,7 +242,7 @@ static void list(struct add_i_state *s, struct string_list *list, int *selected,
 		color_fprintf_ln(stdout, s->header_color,
 				 "%s", opts->header);
 
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		opts->print_item(i, selected ? selected[i] : 0, list->items + i,
 				 opts->print_item_data);
 
@@ -467,14 +467,13 @@ static void collect_changes_cb(struct diff_queue_struct *q,
 {
 	struct collection_status *s = data;
 	struct diffstat_t stat = { 0 };
-	int i;
 
 	if (!q->nr)
 		return;
 
 	compute_diffstat(options, &stat, q);
 
-	for (i = 0; i < stat.nr; i++) {
+	for (int i = 0; i < stat.nr; i++) {
 		const char *name = stat.files[i]->name;
 		int hash = strhash(name);
 		struct pathname_entry *entry;
@@ -535,7 +534,6 @@ static int get_modified_files(struct repository *r,
 	int is_initial = !resolve_ref_unsafe("HEAD", RESOLVE_REF_READING,
 					     &head_oid, NULL);
 	struct collection_status s = { 0 };
-	int i;
 
 	discard_index(r->index);
 	if (repo_read_index_preload(r, ps, 0) < 0)
@@ -545,7 +543,7 @@ static int get_modified_files(struct repository *r,
 	s.files = &files->items;
 	hashmap_init(&s.file_map, pathname_entry_cmp, NULL, 0);
 
-	for (i = 0; i < 2; i++) {
+	for (int i = 0; i < 2; i++) {
 		struct rev_info rev;
 		struct setup_revision_opt opt = { 0 };
 
@@ -678,7 +676,7 @@ static int run_update(struct add_i_state *s, const struct pathspec *ps,
 		      struct list_and_choose_options *opts)
 {
 	int res = 0, fd;
-	size_t count, i;
+	size_t count;
 	struct lock_file index_lock;
 
 	if (get_modified_files(s->r, WORKTREE_ONLY, files, ps, NULL, NULL) < 0)
@@ -702,7 +700,7 @@ static int run_update(struct add_i_state *s, const struct pathspec *ps,
 		return -1;
 	}
 
-	for (i = 0; i < files->items.nr; i++) {
+	for (size_t i = 0; i < files->items.nr; i++) {
 		const char *name = files->items.items[i].string;
 		struct stat st;
 
@@ -733,9 +731,9 @@ static int run_update(struct add_i_state *s, const struct pathspec *ps,
 static void revert_from_diff(struct diff_queue_struct *q,
 			     struct diff_options *opt, void *data UNUSED)
 {
-	int i, add_flags = ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE;
+	int add_flags = ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE;
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filespec *one = q->queue[i]->one;
 		struct cache_entry *ce;
 
@@ -758,7 +756,7 @@ static int run_revert(struct add_i_state *s, const struct pathspec *ps,
 		      struct list_and_choose_options *opts)
 {
 	int res = 0, fd;
-	size_t count, i, j;
+	size_t count, j;
 
 	struct object_id oid;
 	int is_initial = !resolve_ref_unsafe("HEAD", RESOLVE_REF_READING, &oid,
@@ -799,7 +797,7 @@ static int run_revert(struct add_i_state *s, const struct pathspec *ps,
 	}
 
 	ALLOC_ARRAY(paths, count + 1);
-	for (i = j = 0; i < files->items.nr; i++)
+	for (size_t i = j = 0; i < files->items.nr; i++)
 		if (files->selected[i])
 			paths[j++] = files->items.items[i].string;
 	paths[j] = NULL;
@@ -843,7 +841,6 @@ static int get_untracked_files(struct repository *r,
 			       const struct pathspec *ps)
 {
 	struct dir_struct dir = { 0 };
-	size_t i;
 	struct strbuf buf = STRBUF_INIT;
 
 	if (repo_read_index(r) < 0)
@@ -854,7 +851,7 @@ static int get_untracked_files(struct repository *r,
 	add_pattern_list(&dir, EXC_CMDL, "--exclude option");
 	fill_directory(&dir, r->index, ps);
 
-	for (i = 0; i < dir.nr; i++) {
+	for (size_t i = 0; i < dir.nr; i++) {
 		struct dir_entry *ent = dir.entries[i];
 
 		if (index_name_is_other(r->index, ent->name, ent->len)) {
@@ -874,7 +871,7 @@ static int run_add_untracked(struct add_i_state *s, const struct pathspec *ps,
 {
 	struct print_file_item_data *d = opts->list_opts.print_item_data;
 	int res = 0, fd;
-	size_t count, i;
+	size_t count;
 	struct lock_file index_lock;
 
 	if (get_untracked_files(s->r, files, ps) < 0)
@@ -898,7 +895,7 @@ static int run_add_untracked(struct add_i_state *s, const struct pathspec *ps,
 		goto finish_add_untracked;
 	}
 
-	for (i = 0; i < files->items.nr; i++) {
+	for (size_t i = 0; i < files->items.nr; i++) {
 		const char *name = files->items.items[i].string;
 		if (files->selected[i] &&
 		    add_file_to_index(s->r->index, name, 0) < 0) {
diff --git a/add-patch.c b/add-patch.c
index 68f525b35c..219bcc9c9d 100644
--- a/add-patch.c
+++ b/add-patch.c
@@ -275,13 +275,11 @@ struct add_p_state {
 
 static void add_p_state_clear(struct add_p_state *s)
 {
-	size_t i;
-
 	strbuf_release(&s->answer);
 	strbuf_release(&s->buf);
 	strbuf_release(&s->plain);
 	strbuf_release(&s->colored);
-	for (i = 0; i < s->file_diff_nr; i++)
+	for (size_t i = 0; i < s->file_diff_nr; i++)
 		free(s->file_diff[i].hunk);
 	free(s->file_diff);
 	clear_add_i_state(&s->s);
@@ -407,7 +405,7 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
 	struct strbuf *plain = &s->plain, *colored = NULL;
 	struct child_process cp = CHILD_PROCESS_INIT;
 	char *p, *pend, *colored_p = NULL, *colored_pend = NULL, marker = '\0';
-	size_t file_diff_alloc = 0, i, color_arg_index;
+	size_t file_diff_alloc = 0, color_arg_index;
 	struct file_diff *file_diff = NULL;
 	struct hunk *hunk = NULL;
 	int res;
@@ -427,7 +425,7 @@ static int parse_diff(struct add_p_state *s, const struct pathspec *ps)
 	/* Use `--no-color` explicitly, just in case `diff.color = always`. */
 	strvec_pushl(&args, "--no-color", "--ignore-submodules=dirty", "-p",
 		     "--", NULL);
-	for (i = 0; i < ps->nr; i++)
+	for (size_t i = 0; i < ps->nr; i++)
 		strvec_push(&args, ps->items[i].original);
 
 	setup_child_process(s, &cp, NULL);
@@ -878,12 +876,12 @@ static void reassemble_patch(struct add_p_state *s,
 			     struct strbuf *out)
 {
 	struct hunk *hunk;
-	size_t save_len = s->plain.len, i;
+	size_t save_len = s->plain.len;
 	ssize_t delta = 0;
 
 	render_diff_header(s, file_diff, 0, out);
 
-	for (i = file_diff->mode_change; i < file_diff->hunk_nr; i++) {
+	for (size_t i = file_diff->mode_change; i < file_diff->hunk_nr; i++) {
 		struct hunk merged = { 0 };
 
 		hunk = file_diff->hunk + i;
@@ -1722,7 +1720,7 @@ int run_add_p(struct repository *r, enum add_p_mode mode,
 	struct add_p_state s = {
 		{ r }, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT, STRBUF_INIT
 	};
-	size_t i, binary_count = 0;
+	size_t binary_count = 0;
 
 	init_add_i_state(&s.s, r);
 
@@ -1761,7 +1759,7 @@ int run_add_p(struct repository *r, enum add_p_mode mode,
 		return -1;
 	}
 
-	for (i = 0; i < s.file_diff_nr; i++)
+	for (size_t i = 0; i < s.file_diff_nr; i++)
 		if (s.file_diff[i].binary && !s.file_diff[i].hunk_nr)
 			binary_count++;
 		else if (patch_update_file(&s, s.file_diff + i))
diff --git a/advice.c b/advice.c
index 6e9098ff08..e1606a0afd 100644
--- a/advice.c
+++ b/advice.c
@@ -93,14 +93,14 @@ static void vadvise(const char *advice, int display_instructions,
 		    const char *key, va_list params)
 {
 	struct strbuf buf = STRBUF_INIT;
-	const char *cp, *np;
+	const char *np;
 
 	strbuf_vaddf(&buf, advice, params);
 
 	if (display_instructions)
 		strbuf_addf(&buf, turn_off_instructions, key);
 
-	for (cp = buf.buf; *cp; cp = np) {
+	for (const char *cp = buf.buf; *cp; cp = np) {
 		np = strchrnul(cp, '\n');
 		fprintf(stderr,	_("%shint: %.*s%s\n"),
 			advise_get_color(ADVICE_COLOR_HINT),
@@ -147,7 +147,6 @@ void advise_if_enabled(enum advice_type type, const char *advice, ...)
 int git_default_advice_config(const char *var, const char *value)
 {
 	const char *k, *slot_name;
-	int i;
 
 	if (!strcmp(var, "color.advice")) {
 		advice_use_color = git_config_colorbool(var, value);
@@ -166,7 +165,7 @@ int git_default_advice_config(const char *var, const char *value)
 	if (!skip_prefix(var, "advice.", &k))
 		return 0;
 
-	for (i = 0; i < ARRAY_SIZE(advice_setting); i++) {
+	for (int i = 0; i < ARRAY_SIZE(advice_setting); i++) {
 		if (strcasecmp(k, advice_setting[i].key))
 			continue;
 		advice_setting[i].level = git_config_bool(var, value)
@@ -180,9 +179,7 @@ int git_default_advice_config(const char *var, const char *value)
 
 void list_config_advices(struct string_list *list, const char *prefix)
 {
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(advice_setting); i++)
+	for (int i = 0; i < ARRAY_SIZE(advice_setting); i++)
 		list_config_item(list, prefix, advice_setting[i].key);
 }
 
diff --git a/apply.c b/apply.c
index 355e2b0f2f..2b1582fa0e 100644
--- a/apply.c
+++ b/apply.c
@@ -504,7 +504,7 @@ static char *find_name_gnu(struct strbuf *root,
 
 static size_t sane_tz_len(const char *line, size_t len)
 {
-	const char *tz, *p;
+	const char *tz;
 
 	if (len < strlen(" +0500") || line[len-strlen(" +0500")] != ' ')
 		return 0;
@@ -513,7 +513,7 @@ static size_t sane_tz_len(const char *line, size_t len)
 	if (tz[1] != '+' && tz[1] != '-')
 		return 0;
 
-	for (p = tz + 2; p != line + len; p++)
+	for (const char *p = tz + 2; p != line + len; p++)
 		if (!isdigit(*p))
 			return 0;
 
@@ -801,13 +801,13 @@ static int has_epoch_timestamp(const char *nameline)
 		"^[0-2][0-9]:([0-5][0-9]):00(\\.0+)?"
 		" "
 		"([-+][0-2][0-9]:?[0-5][0-9])\n";
-	const char *timestamp = NULL, *cp, *colon;
+	const char *timestamp = NULL, *colon;
 	static regex_t *stamp;
 	regmatch_t m[10];
 	int zoneoffset, epoch_hour, hour, minute;
 	int status;
 
-	for (cp = nameline; *cp != '\n'; cp++) {
+	for (const char *cp = nameline; *cp != '\n'; cp++) {
 		if (*cp == '\t')
 			timestamp = cp + 1;
 	}
@@ -1144,13 +1144,12 @@ static const char *skip_tree_prefix(int p_value,
 				    int llen)
 {
 	int nslash;
-	int i;
 
 	if (!p_value)
 		return (llen && line[0] == '/') ? NULL : line;
 
 	nslash = p_value;
-	for (i = 0; i < llen; i++) {
+	for (int i = 0; i < llen; i++) {
 		int ch = line[i];
 		if (ch == '/' && --nslash <= 0)
 			return (i == 0) ? NULL : &line[i + 1];
@@ -1550,14 +1549,15 @@ static int find_header(struct apply_state *state,
 		       int *hdrsize,
 		       struct patch *patch)
 {
-	unsigned long offset, len;
+	unsigned long len;
 
 	patch->is_toplevel_relative = 0;
 	patch->is_rename = patch->is_copy = 0;
 	patch->is_new = patch->is_delete = -1;
 	patch->old_mode = patch->new_mode = 0;
 	patch->old_name = patch->new_name = NULL;
-	for (offset = 0; size > 0; offset += len, size -= len, line += len, state->linenr++) {
+	for (unsigned long offset = 0; size > 0; offset += len, size -= len,
+	     line += len, state->linenr++) {
 		unsigned long nextlen;
 
 		len = linelen(line, size);
@@ -2100,7 +2100,6 @@ static void add_name_limit(struct apply_state *state,
 static int use_patch(struct apply_state *state, struct patch *p)
 {
 	const char *pathname = p->new_name ? p->new_name : p->old_name;
-	int i;
 
 	/* Paths outside are not touched regardless of "--include" */
 	if (state->prefix && *state->prefix) {
@@ -2110,7 +2109,7 @@ static int use_patch(struct apply_state *state, struct patch *p)
 	}
 
 	/* See if it matches any of exclude/include rule */
-	for (i = 0; i < state->limit_by_name.nr; i++) {
+	for (int i = 0; i < state->limit_by_name.nr; i++) {
 		struct string_list_item *it = &state->limit_by_name.items[i];
 		if (!wildmatch(it->string, pathname, 0))
 			return (it->util != NULL);
@@ -2186,8 +2185,7 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
 				"Files ",
 				NULL,
 			};
-			int i;
-			for (i = 0; binhdr[i]; i++) {
+			for (int i = 0; binhdr[i]; i++) {
 				int len = strlen(binhdr[i]);
 				if (len < size - hd &&
 				    !memcmp(binhdr[i], buffer + hd, len)) {
@@ -4131,7 +4129,6 @@ static int preimage_oid_in_gitlink_patch(struct patch *p, struct object_id *oid)
 /* Build an index that contains just the files needed for a 3way merge */
 static int build_fake_ancestor(struct apply_state *state, struct patch *list)
 {
-	struct patch *patch;
 	struct index_state result = INDEX_STATE_INIT(state->repo);
 	struct lock_file lock = LOCK_INIT;
 	int res;
@@ -4139,7 +4136,7 @@ static int build_fake_ancestor(struct apply_state *state, struct patch *list)
 	/* Once we start supporting the reverse patch, it may be
 	 * worth showing the new sha1 prefix, but until then...
 	 */
-	for (patch = list; patch; patch = patch->next) {
+	for (struct patch *patch = list; patch; patch = patch->next) {
 		struct object_id oid;
 		struct cache_entry *ce;
 		const char *name;
@@ -4270,9 +4267,7 @@ static void show_rename_copy(struct patch *p)
 
 static void summary_patch_list(struct patch *patch)
 {
-	struct patch *p;
-
-	for (p = patch; p; p = p->next) {
+	for (struct patch *p = patch; p; p = p->next) {
 		if (p->is_new)
 			show_file_mode_name("create", p->new_mode, p->new_name);
 		else if (p->is_delete)
@@ -4524,7 +4519,7 @@ static int create_one_file(struct apply_state *state,
 static int add_conflicted_stages_file(struct apply_state *state,
 				       struct patch *patch)
 {
-	int stage, namelen;
+	int namelen;
 	unsigned mode;
 	struct cache_entry *ce;
 
@@ -4534,7 +4529,7 @@ static int add_conflicted_stages_file(struct apply_state *state,
 	mode = patch->new_mode ? patch->new_mode : (S_IFREG | 0644);
 
 	remove_file_from_index(state->repo->index, patch->new_name);
-	for (stage = 1; stage < 4; stage++) {
+	for (int stage = 1; stage < 4; stage++) {
 		if (is_null_oid(&patch->threeway_stage[stage - 1]))
 			continue;
 		ce = make_empty_cache_entry(state->repo->index, namelen);
@@ -4690,12 +4685,11 @@ static int write_out_one_reject(struct apply_state *state, struct patch *patch)
  */
 static int write_out_results(struct apply_state *state, struct patch *list)
 {
-	int phase;
 	int errs = 0;
 	struct patch *l;
 	struct string_list cpath = STRING_LIST_INIT_DUP;
 
-	for (phase = 0; phase < 2; phase++) {
+	for (int phase = 0; phase < 2; phase++) {
 		l = list;
 		while (l) {
 			if (l->rejected)
@@ -4967,12 +4961,11 @@ int apply_all_patches(struct apply_state *state,
 		      const char **argv,
 		      int options)
 {
-	int i;
 	int res;
 	int errs = 0;
 	int read_stdin = 1;
 
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		const char *arg = argv[i];
 		char *to_free = NULL;
 		int fd;
diff --git a/archive-tar.c b/archive-tar.c
index 8ae30125f8..d5dcc342cd 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -157,11 +157,11 @@ static void strbuf_append_ext_header(struct strbuf *sb, const char *keyword,
 				     const char *value, size_t valuelen)
 {
 	size_t orig_len = sb->len;
-	size_t len, tmp;
+	size_t len;
 
 	/* "%u %s=%s\n" */
 	len = 1 + 1 + strlen(keyword) + 1 + valuelen + 1;
-	for (tmp = 1; len / 10 >= tmp; tmp *= 10)
+	for (size_t tmp = 1; len / 10 >= tmp; tmp *= 10)
 		len++;
 
 	strbuf_grow(sb, len);
@@ -362,8 +362,7 @@ static int alloc_tar_filters;
 
 static struct archiver *find_tar_filter(const char *name, size_t len)
 {
-	int i;
-	for (i = 0; i < nr_tar_filters; i++) {
+	for (int i = 0; i < nr_tar_filters; i++) {
 		struct archiver *ar = tar_filters[i];
 		if (!xstrncmpz(ar->name, name, len))
 			return ar;
@@ -531,7 +530,6 @@ static struct archiver tar_archiver = {
 
 void init_tar_archiver(void)
 {
-	int i;
 	register_archiver(&tar_archiver);
 
 	tar_filter_config("tar.tgz.command", internal_gzip_command, NULL);
@@ -539,7 +537,7 @@ void init_tar_archiver(void)
 	tar_filter_config("tar.tar.gz.command", internal_gzip_command, NULL);
 	tar_filter_config("tar.tar.gz.remote", "true", NULL);
 	git_config(git_tar_config, NULL);
-	for (i = 0; i < nr_tar_filters; i++) {
+	for (int i = 0; i < nr_tar_filters; i++) {
 		/* omit any filters that never had a command configured */
 		if (tar_filters[i]->filter_command)
 			register_archiver(tar_filters[i]);
diff --git a/archive.c b/archive.c
index a6730bebfa..ea30af9ffb 100644
--- a/archive.c
+++ b/archive.c
@@ -308,7 +308,6 @@ int write_archive_entries(struct archiver_args *args,
 	struct strbuf path_in_archive = STRBUF_INIT;
 	struct strbuf content = STRBUF_INIT;
 	struct object_id fake_oid;
-	int i;
 
 	oidcpy(&fake_oid, null_oid());
 
@@ -357,7 +356,7 @@ int write_archive_entries(struct archiver_args *args,
 		context.bottom = next;
 	}
 
-	for (i = 0; i < args->extra_files.nr; i++) {
+	for (int i = 0; i < args->extra_files.nr; i++) {
 		struct string_list_item *item = args->extra_files.items + i;
 		char *path = item->string;
 		struct extra_file_info *info = item->util;
@@ -396,12 +395,10 @@ int write_archive_entries(struct archiver_args *args,
 
 static const struct archiver *lookup_archiver(const char *name)
 {
-	int i;
-
 	if (!name)
 		return NULL;
 
-	for (i = 0; i < nr_archivers; i++) {
+	for (int i = 0; i < nr_archivers; i++) {
 		if (!strcmp(name, archivers[i]->name))
 			return archivers[i];
 	}
@@ -784,9 +781,7 @@ static int match_extension(const char *filename, const char *ext)
 
 const char *archive_format_from_filename(const char *filename)
 {
-	int i;
-
-	for (i = 0; i < nr_archivers; i++)
+	for (int i = 0; i < nr_archivers; i++)
 		if (match_extension(filename, archivers[i]->name))
 			return archivers[i]->name;
 	return NULL;
diff --git a/attr.c b/attr.c
index 679e42258c..af70c6a73f 100644
--- a/attr.c
+++ b/attr.c
@@ -142,7 +142,6 @@ struct all_attrs_item {
  */
 static void all_attrs_init(struct attr_hashmap *map, struct attr_check *check)
 {
-	int i;
 	unsigned int size;
 
 	hashmap_lock(map);
@@ -178,7 +177,7 @@ static void all_attrs_init(struct attr_hashmap *map, struct attr_check *check)
 	 * This re-initialization can live outside of the locked region since
 	 * the attribute dictionary is no longer being accessed.
 	 */
-	for (i = 0; i < check->all_attrs_nr; i++) {
+	for (int i = 0; i < check->all_attrs_nr; i++) {
 		check->all_attrs[i].value = ATTR__UNKNOWN;
 		check->all_attrs[i].macro = NULL;
 	}
@@ -471,9 +470,8 @@ struct attr_stack {
 
 static void attr_stack_free(struct attr_stack *e)
 {
-	unsigned i;
 	free(e->origin);
-	for (i = 0; i < e->num_matches; i++) {
+	for (unsigned i = 0; i < e->num_matches; i++) {
 		struct match_attr *a = e->attrs[i];
 		size_t j;
 
@@ -558,11 +556,9 @@ static void check_vector_remove(struct attr_check *check)
 /* Iterate through all attr_check instances and drop their stacks */
 static void drop_all_attr_stacks(void)
 {
-	int i;
-
 	vector_lock();
 
-	for (i = 0; i < check_vector.nr; i++) {
+	for (int i = 0; i < check_vector.nr; i++) {
 		drop_attr_stack(&check_vector.checks[i]->stack);
 	}
 
@@ -1102,9 +1098,7 @@ static int macroexpand_one(struct all_attrs_item *all_attrs, int nr, int rem);
 static int fill_one(struct all_attrs_item *all_attrs,
 		    const struct match_attr *a, int rem)
 {
-	size_t i;
-
-	for (i = a->num_attr; rem > 0 && i > 0; i--) {
+	for (size_t i = a->num_attr; rem > 0 && i > 0; i--) {
 		const struct git_attr *attr = a->state[i - 1].attr;
 		const char **n = &(all_attrs[attr->attr_nr].value);
 		const char *v = a->state[i - 1].setto;
@@ -1262,9 +1256,7 @@ static const char *interned_mode_string(unsigned int mode)
 		{ .val = 0120000 },
 		{ .val = 0160000 },
 	};
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(mode_string); i++) {
+	for (int i = 0; i < ARRAY_SIZE(mode_string); i++) {
 		if (mode_string[i].val != mode)
 			continue;
 		if (!*mode_string[i].str)
@@ -1333,12 +1325,11 @@ void git_check_attr(struct index_state *istate,
 		    const char *path,
 		    struct attr_check *check)
 {
-	int i;
 	const struct object_id *tree_oid = default_attr_source();
 
 	collect_some_attrs(istate, tree_oid, path, check);
 
-	for (i = 0; i < check->nr; i++) {
+	for (int i = 0; i < check->nr; i++) {
 		unsigned int n = check->items[i].attr->attr_nr;
 		const char *value = check->all_attrs[n].value;
 		if (value == ATTR__UNKNOWN)
@@ -1350,13 +1341,12 @@ void git_check_attr(struct index_state *istate,
 void git_all_attrs(struct index_state *istate,
 		   const char *path, struct attr_check *check)
 {
-	int i;
 	const struct object_id *tree_oid = default_attr_source();
 
 	attr_check_reset(check);
 	collect_some_attrs(istate, tree_oid, path, check);
 
-	for (i = 0; i < check->all_attrs_nr; i++) {
+	for (int i = 0; i < check->all_attrs_nr; i++) {
 		const char *name = check->all_attrs[i].attr->name;
 		const char *value = check->all_attrs[i].value;
 		struct attr_check_item *item;
diff --git a/base85.c b/base85.c
index bbacdca31b..0598e1c626 100644
--- a/base85.c
+++ b/base85.c
@@ -29,10 +29,9 @@ static const char en85[] = {
 static char de85[256];
 static void prep_base85(void)
 {
-	int i;
 	if (de85['Z'])
 		return;
-	for (i = 0; i < ARRAY_SIZE(en85); i++) {
+	for (int i = 0; i < ARRAY_SIZE(en85); i++) {
 		int ch = en85[i];
 		de85[ch] = i + 1;
 	}
diff --git a/bisect.c b/bisect.c
index f75e50c339..fe2d57c908 100644
--- a/bisect.c
+++ b/bisect.c
@@ -139,14 +139,12 @@ static inline int approx_halfway(struct commit_list *p, int nr)
 static void show_list(const char *debug, int counted, int nr,
 		      struct commit_list *list)
 {
-	struct commit_list *p;
-
 	if (!DEBUG_BISECT)
 		return;
 
 	fprintf(stderr, "%s (%d/%d)\n", debug, counted, nr);
 
-	for (p = list; p; p = p->next) {
+	for (struct commit_list *p = list; p; p = p->next) {
 		struct commit_list *pp;
 		struct commit *commit = p->item;
 		unsigned commit_flags = commit->object.flags;
@@ -183,11 +181,11 @@ static void show_list(const char *debug, int counted, int nr,
 
 static struct commit_list *best_bisection(struct commit_list *list, int nr)
 {
-	struct commit_list *p, *best;
+	struct commit_list *best;
 	int best_distance = -1;
 
 	best = list;
-	for (p = list; p; p = p->next) {
+	for (struct commit_list *p = list; p; p = p->next) {
 		int distance;
 		unsigned commit_flags = p->item->object.flags;
 
@@ -500,9 +498,7 @@ static void read_bisect_paths(struct strvec *array)
 static char *join_oid_array_hex(struct oid_array *array, char delim)
 {
 	struct strbuf joined_hexs = STRBUF_INIT;
-	int i;
-
-	for (i = 0; i < array->nr; i++) {
+	for (int i = 0; i < array->nr; i++) {
 		strbuf_addstr(&joined_hexs, oid_to_hex(array->oid + i));
 		if (i + 1 < array->nr)
 			strbuf_addch(&joined_hexs, delim);
@@ -611,7 +607,7 @@ static int sqrti(int val)
 static struct commit_list *skip_away(struct commit_list *list, int count)
 {
 	struct commit_list *cur, *previous;
-	int prn, index, i;
+	int prn, index;
 
 	prn = get_prn(count);
 	index = (count * prn / PRN_MODULO) * sqrti(prn) / sqrti(PRN_MODULO);
@@ -619,7 +615,7 @@ static struct commit_list *skip_away(struct commit_list *list, int count)
 	cur = list;
 	previous = NULL;
 
-	for (i = 0; cur; cur = cur->next, i++) {
+	for (int i = 0; cur; cur = cur->next, i++) {
 		if (i == index) {
 			if (!oideq(&cur->item->object.oid, current_bad_oid))
 				return cur;
@@ -660,7 +656,6 @@ static void bisect_rev_setup(struct repository *r, struct rev_info *revs,
 	struct setup_revision_opt opt = {
 		.free_removed_argv_elements = 1,
 	};
-	int i;
 
 	repo_init_revisions(r, revs, prefix);
 	revs->abbrev = 0;
@@ -669,7 +664,7 @@ static void bisect_rev_setup(struct repository *r, struct rev_info *revs,
 	/* rev_argv.argv[0] will be ignored by setup_revisions */
 	strvec_push(rev_argv, "bisect_rev_setup");
 	strvec_pushf(rev_argv, bad_format, oid_to_hex(current_bad_oid));
-	for (i = 0; i < good_revs.nr; i++)
+	for (int i = 0; i < good_revs.nr; i++)
 		strvec_pushf(rev_argv, good_format,
 			     oid_to_hex(good_revs.oid + i));
 	strvec_push(rev_argv, "--");
@@ -763,11 +758,11 @@ static struct commit **get_bad_and_good_commits(struct repository *r,
 						int *rev_nr)
 {
 	struct commit **rev;
-	int i, n = 0;
+	int n = 0;
 
 	ALLOC_ARRAY(rev, 1 + good_revs.nr);
 	rev[n++] = get_commit_reference(r, current_bad_oid);
-	for (i = 0; i < good_revs.nr; i++)
+	for (int i = 0; i < good_revs.nr; i++)
 		rev[n++] = get_commit_reference(r, good_revs.oid + i);
 	*rev_nr = n;
 
diff --git a/blame.c b/blame.c
index 1a16d4eb6a..c15162591e 100644
--- a/blame.c
+++ b/blame.c
@@ -41,12 +41,13 @@ static void set_blame_suspects(struct commit *commit, struct blame_origin *origi
 void blame_origin_decref(struct blame_origin *o)
 {
 	if (o && --o->refcnt <= 0) {
-		struct blame_origin *p, *l = NULL;
+		struct blame_origin *l = NULL;
 		if (o->previous)
 			blame_origin_decref(o->previous);
 		free(o->file.ptr);
 		/* Should be present exactly once in commit chain */
-		for (p = get_blame_suspects(o->commit); p; l = p, p = p->next) {
+		for (struct blame_origin *p = get_blame_suspects(o->commit); p; l = p,
+		     p = p->next) {
 			if (p == o) {
 				if (l)
 					l->next = p->next;
@@ -104,10 +105,9 @@ static struct blame_origin *get_origin(struct commit *commit, const char *path)
 static void verify_working_tree_path(struct repository *r,
 				     struct commit *work_tree, const char *path)
 {
-	struct commit_list *parents;
 	int pos;
 
-	for (parents = work_tree->parents; parents; parents = parents->next) {
+	for (struct commit_list *parents = work_tree->parents; parents; parents = parents->next) {
 		const struct object_id *commit_oid = &parents->item->object.oid;
 		struct object_id blob_oid;
 		unsigned short mode;
@@ -190,7 +190,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,
 {
 	struct commit *commit;
 	struct blame_origin *origin;
-	struct commit_list **parent_tail, *parent;
+	struct commit_list **parent_tail;
 	struct strbuf buf = STRBUF_INIT;
 	const char *ident;
 	time_t now;
@@ -219,7 +219,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,
 		ident = fmt_ident("Not Committed Yet", "not.committed.yet",
 				  WANT_BLANK_IDENT, NULL, 0);
 	strbuf_addstr(&msg, "tree 0000000000000000000000000000000000000000\n");
-	for (parent = commit->parents; parent; parent = parent->next)
+	for (struct commit_list *parent = commit->parents; parent; parent = parent->next)
 		strbuf_addf(&msg, "parent %s\n",
 			    oid_to_hex(&parent->item->object.oid));
 	strbuf_addf(&msg,
@@ -407,7 +407,6 @@ static void get_fingerprint(struct fingerprint *result,
 			    const char *line_end)
 {
 	unsigned int hash, c0 = 0, c1;
-	const char *p;
 	int max_map_entry_count = 1 + line_end - line_begin;
 	struct fingerprint_entry *entry = xcalloc(max_map_entry_count,
 		sizeof(struct fingerprint_entry));
@@ -415,7 +414,7 @@ static void get_fingerprint(struct fingerprint *result,
 
 	hashmap_init(&result->map, NULL, NULL, max_map_entry_count);
 	result->entries = entry;
-	for (p = line_begin; p <= line_end; ++p, c0 = c1) {
+	for (const char *p = line_begin; p <= line_end; ++p, c0 = c1) {
 		/* Always terminate the string with whitespace.
 		 * Normalise whitespace to 0, and normalise letters to
 		 * lower case. This won't work for multibyte characters but at
@@ -503,11 +502,10 @@ static void get_line_fingerprints(struct fingerprint *fingerprints,
 				  const char *content, const int *line_starts,
 				  long first_line, long line_count)
 {
-	int i;
 	const char *linestart, *lineend;
 
 	line_starts += first_line;
-	for (i = 0; i < line_count; ++i) {
+	for (int i = 0; i < line_count; ++i) {
 		linestart = content + line_starts[i];
 		lineend = content + line_starts[i + 1];
 		get_fingerprint(fingerprints + i, linestart, lineend);
@@ -517,9 +515,7 @@ static void get_line_fingerprints(struct fingerprint *fingerprints,
 static void free_line_fingerprints(struct fingerprint *fingerprints,
 				   int nr_fingerprints)
 {
-	int i;
-
-	for (i = 0; i < nr_fingerprints; i++)
+	for (int i = 0; i < nr_fingerprints; i++)
 		free_fingerprint(&fingerprints[i]);
 }
 
@@ -644,7 +640,7 @@ static void find_best_line_matches(
 	const struct line_number_mapping *map_line_number_in_b_to_a)
 {
 
-	int i, search_start, search_end, closest_local_line_a, *similarity,
+	int search_start, search_end, closest_local_line_a, *similarity,
 		best_similarity = 0, second_best_similarity = 0,
 		best_similarity_index = 0, second_best_similarity_index = 0;
 
@@ -663,7 +659,7 @@ static void find_best_line_matches(
 	if (search_end > length_a)
 		search_end = length_a;
 
-	for (i = search_start; i < search_end; ++i) {
+	for (int i = search_start; i < search_end; ++i) {
 		similarity = get_similarity(similarities,
 					    i, local_line_b,
 					    closest_local_line_a,
@@ -1158,9 +1154,7 @@ static int compare_commits_by_reverse_commit_date(const void *a,
 static void sanity_check_refcnt(struct blame_scoreboard *sb)
 {
 	int baa = 0;
-	struct blame_entry *ent;
-
-	for (ent = sb->ent; ent; ent = ent->next) {
+	for (struct blame_entry *ent = sb->ent; ent; ent = ent->next) {
 		/* Nobody should have zero or negative refcnt */
 		if (ent->suspect->refcnt <= 0) {
 			fprintf(stderr, "%s in %s has negative refcnt %d\n",
@@ -1181,9 +1175,9 @@ static void sanity_check_refcnt(struct blame_scoreboard *sb)
  */
 void blame_coalesce(struct blame_scoreboard *sb)
 {
-	struct blame_entry *ent, *next;
+	struct blame_entry *next;
 
-	for (ent = sb->ent; ent && (next = ent->next); ent = next) {
+	for (struct blame_entry *ent = sb->ent; ent && (next = ent->next); ent = next) {
 		if (ent->suspect == next->suspect &&
 		    ent->s_lno + ent->num_lines == next->s_lno &&
 		    ent->lno + ent->num_lines == next->lno &&
@@ -1214,8 +1208,7 @@ static void queue_blames(struct blame_scoreboard *sb, struct blame_origin *porig
 	if (porigin->suspects)
 		porigin->suspects = blame_merge(porigin->suspects, sorted);
 	else {
-		struct blame_origin *o;
-		for (o = get_blame_suspects(porigin->commit); o; o = o->next) {
+		for (struct blame_origin *o = get_blame_suspects(porigin->commit); o; o = o->next) {
 			if (o->suspects) {
 				porigin->suspects = sorted;
 				return;
@@ -1269,7 +1262,6 @@ static int maybe_changed_path(struct repository *r,
 			      struct blame_origin *origin,
 			      struct blame_bloom_data *bd)
 {
-	int i;
 	struct bloom_filter *filter;
 
 	if (!bd)
@@ -1284,7 +1276,7 @@ static int maybe_changed_path(struct repository *r,
 		return 1;
 
 	bloom_count_queries++;
-	for (i = 0; i < bd->nr; i++) {
+	for (int i = 0; i < bd->nr; i++) {
 		if (bloom_filter_contains(filter,
 					  bd->keys[i],
 					  bd->settings))
@@ -1372,15 +1364,8 @@ static struct blame_origin *find_origin(struct repository *r,
 		oidcpy(&porigin->blob_oid, &origin->blob_oid);
 		porigin->mode = origin->mode;
 	} else {
-		/*
-		 * Since origin->path is a pathspec, if the parent
-		 * commit had it as a directory, we will see a whole
-		 * bunch of deletion of files in the directory that we
-		 * do not care about.
-		 */
-		int i;
 		struct diff_filepair *p = NULL;
-		for (i = 0; i < diff_queued_diff.nr; i++) {
+		for (int i = 0; i < diff_queued_diff.nr; i++) {
 			const char *name;
 			p = diff_queued_diff.queue[i];
 			name = p->one->path ? p->one->path : p->two->path;
@@ -1419,7 +1404,6 @@ static struct blame_origin *find_rename(struct repository *r,
 {
 	struct blame_origin *porigin = NULL;
 	struct diff_options diff_opts;
-	int i;
 
 	repo_diff_setup(r, &diff_opts);
 	diff_opts.flags.recursive = 1;
@@ -1436,7 +1420,7 @@ static struct blame_origin *find_rename(struct repository *r,
 			      "", &diff_opts);
 	diffcore_std(&diff_opts);
 
-	for (i = 0; i < diff_queued_diff.nr; i++) {
+	for (int i = 0; i < diff_queued_diff.nr; i++) {
 		struct diff_filepair *p = diff_queued_diff.queue[i];
 		if ((p->status == 'R' || p->status == 'C') &&
 		    !strcmp(p->two->path, origin->path)) {
@@ -1507,10 +1491,9 @@ static void split_overlap(struct blame_entry *split,
 			  struct blame_origin *parent)
 {
 	int chunk_end_lno;
-	int i;
 	memset(split, 0, sizeof(struct blame_entry [3]));
 
-	for (i = 0; i < 3; i++) {
+	for (int i = 0; i < 3; i++) {
 		split[i].ignored = e->ignored;
 		split[i].unblamable = e->unblamable;
 	}
@@ -1594,9 +1577,7 @@ static void split_blame(struct blame_entry ***blamed,
  */
 static void decref_split(struct blame_entry *split)
 {
-	int i;
-
-	for (i = 0; i < 3; i++)
+	for (int i = 0; i < 3; i++)
 		blame_origin_decref(split[i].suspect);
 }
 
@@ -1661,12 +1642,12 @@ static int scan_parent_range(struct fingerprint *p_fps,
 			     struct fingerprint *t_fps, int t_idx,
 			     int from, int nr_lines)
 {
-	int sim, p_idx;
+	int sim;
 	#define FINGERPRINT_FILE_THRESHOLD	10
 	int best_sim_val = FINGERPRINT_FILE_THRESHOLD;
 	int best_sim_idx = -1;
 
-	for (p_idx = from; p_idx < from + nr_lines; p_idx++) {
+	for (int p_idx = from; p_idx < from + nr_lines; p_idx++) {
 		sim = fingerprint_similarity(&t_fps[t_idx], &p_fps[p_idx]);
 		if (sim < best_sim_val)
 			continue;
@@ -1691,14 +1672,14 @@ static void guess_line_blames(struct blame_origin *parent,
 			      int tlno, int offset, int same, int parent_len,
 			      struct blame_line_tracker *line_blames)
 {
-	int i, best_idx, target_idx;
+	int best_idx, target_idx;
 	int parent_slno = tlno + offset;
 	int *fuzzy_matches;
 
 	fuzzy_matches = fuzzy_find_matching_lines(parent, target,
 						  tlno, parent_slno, same,
 						  parent_len);
-	for (i = 0; i < same - tlno; i++) {
+	for (int i = 0; i < same - tlno; i++) {
 		target_idx = tlno + i;
 		if (fuzzy_matches && fuzzy_matches[i] >= 0) {
 			best_idx = fuzzy_matches[i];
@@ -1735,7 +1716,7 @@ static void ignore_blame_entry(struct blame_entry *e,
 			       struct blame_entry **ignoredp,
 			       struct blame_line_tracker *line_blames)
 {
-	int entry_len, nr_lines, i;
+	int entry_len, nr_lines;
 
 	/*
 	 * We carve new entries off the front of e.  Each entry comes from a
@@ -1744,7 +1725,7 @@ static void ignore_blame_entry(struct blame_entry *e,
 	 */
 	entry_len = 1;
 	nr_lines = e->num_lines;	/* e changes in the loop */
-	for (i = 0; i < nr_lines; i++) {
+	for (int i = 0; i < nr_lines; i++) {
 		struct blame_entry *next = NULL;
 
 		/*
@@ -2012,8 +1993,6 @@ static void copy_split_if_better(struct blame_scoreboard *sb,
 				 struct blame_entry *best_so_far,
 				 struct blame_entry *potential)
 {
-	int i;
-
 	if (!potential[1].suspect)
 		return;
 	if (best_so_far[1].suspect) {
@@ -2022,7 +2001,7 @@ static void copy_split_if_better(struct blame_scoreboard *sb,
 			return;
 	}
 
-	for (i = 0; i < 3; i++)
+	for (int i = 0; i < 3; i++)
 		blame_origin_incref(potential[i].suspect);
 	decref_split(best_so_far);
 	memcpy(best_so_far, potential, sizeof(struct blame_entry[3]));
@@ -2335,7 +2314,7 @@ static void find_copy_in_parent(struct blame_scoreboard *sb,
 static void pass_whole_blame(struct blame_scoreboard *sb,
 			     struct blame_origin *origin, struct blame_origin *porigin)
 {
-	struct blame_entry *e, *suspects;
+	struct blame_entry *suspects;
 
 	if (!porigin->file.ptr && origin->file.ptr) {
 		/* Steal its file */
@@ -2344,7 +2323,7 @@ static void pass_whole_blame(struct blame_scoreboard *sb,
 	}
 	suspects = origin->suspects;
 	origin->suspects = NULL;
-	for (e = suspects; e; e = e->next) {
+	for (struct blame_entry *e = suspects; e; e = e->next) {
 		blame_origin_incref(porigin);
 		blame_origin_decref(e->suspect);
 		e->suspect = porigin;
@@ -2409,7 +2388,7 @@ typedef struct blame_origin *(*blame_find_alg)(struct repository *,
 static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin, int opt)
 {
 	struct rev_info *revs = sb->revs;
-	int i, pass, num_sg;
+	int i, num_sg;
 	struct commit *commit = origin->commit;
 	struct commit_list *sg;
 	struct blame_origin *sg_buf[MAXSG];
@@ -2429,7 +2408,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,
 	 * The first pass looks for unrenamed path to optimize for
 	 * common cases, then we look for renames in the second pass.
 	 */
-	for (pass = 0; pass < 2 - sb->no_whole_file_rename; pass++) {
+	for (int pass = 0; pass < 2 - sb->no_whole_file_rename; pass++) {
 		blame_find_alg find = pass ? find_rename : find_origin;
 
 		for (i = 0, sg = first_scapegoat(revs, commit, sb->reverse);
@@ -2656,11 +2635,10 @@ static int prepare_lines(struct blame_scoreboard *sb)
 static struct commit *find_single_final(struct rev_info *revs,
 					const char **name_p)
 {
-	int i;
 	struct commit *found = NULL;
 	const char *name = NULL;
 
-	for (i = 0; i < revs->pending.nr; i++) {
+	for (int i = 0; i < revs->pending.nr; i++) {
 		struct object *obj = revs->pending.objects[i].item;
 		if (obj->flags & UNINTERESTING)
 			continue;
@@ -2719,7 +2697,6 @@ static struct commit *dwim_reverse_initial(struct rev_info *revs,
 static struct commit *find_single_initial(struct rev_info *revs,
 					  const char **name_p)
 {
-	int i;
 	struct commit *found = NULL;
 	const char *name = NULL;
 
@@ -2727,7 +2704,7 @@ static struct commit *find_single_initial(struct rev_info *revs,
 	 * There must be one and only one negative commit, and it must be
 	 * the boundary.
 	 */
-	for (i = 0; i < revs->pending.nr; i++) {
+	for (int i = 0; i < revs->pending.nr; i++) {
 		struct object *obj = revs->pending.objects[i].item;
 		if (!(obj->flags & UNINTERESTING))
 			continue;
@@ -2929,8 +2906,7 @@ void setup_blame_bloom_data(struct blame_scoreboard *sb)
 void cleanup_scoreboard(struct blame_scoreboard *sb)
 {
 	if (sb->bloom_data) {
-		int i;
-		for (i = 0; i < sb->bloom_data->nr; i++) {
+		for (int i = 0; i < sb->bloom_data->nr; i++) {
 			free(sb->bloom_data->keys[i]->hashes);
 			free(sb->bloom_data->keys[i]);
 		}
diff --git a/bloom.c b/bloom.c
index e529f7605c..58bb79e62c 100644
--- a/bloom.c
+++ b/bloom.c
@@ -107,14 +107,13 @@ uint32_t murmur3_seeded(uint32_t seed, const char *data, size_t len)
 	const uint32_t r2 = 13;
 	const uint32_t m = 5;
 	const uint32_t n = 0xe6546b64;
-	int i;
 	uint32_t k1 = 0;
 	const char *tail;
 
 	int len4 = len / sizeof(uint32_t);
 
 	uint32_t k;
-	for (i = 0; i < len4; i++) {
+	for (int i = 0; i < len4; i++) {
 		uint32_t byte1 = (uint32_t)data[4*i];
 		uint32_t byte2 = ((uint32_t)data[4*i + 1]) << 8;
 		uint32_t byte3 = ((uint32_t)data[4*i + 2]) << 16;
@@ -161,14 +160,13 @@ void fill_bloom_key(const char *data,
 		    struct bloom_key *key,
 		    const struct bloom_filter_settings *settings)
 {
-	int i;
 	const uint32_t seed0 = 0x293ae76f;
 	const uint32_t seed1 = 0x7e646e2c;
 	const uint32_t hash0 = murmur3_seeded(seed0, data, len);
 	const uint32_t hash1 = murmur3_seeded(seed1, data, len);
 
 	key->hashes = (uint32_t *)xcalloc(settings->num_hashes, sizeof(uint32_t));
-	for (i = 0; i < settings->num_hashes; i++)
+	for (int i = 0; i < settings->num_hashes; i++)
 		key->hashes[i] = hash0 + i * hash1;
 }
 
@@ -181,10 +179,9 @@ void add_key_to_filter(const struct bloom_key *key,
 		       struct bloom_filter *filter,
 		       const struct bloom_filter_settings *settings)
 {
-	int i;
 	uint64_t mod = filter->len * BITS_PER_WORD;
 
-	for (i = 0; i < settings->num_hashes; i++) {
+	for (int i = 0; i < settings->num_hashes; i++) {
 		uint64_t hash_mod = key->hashes[i] % mod;
 		uint64_t block_pos = hash_mod / BITS_PER_WORD;
 
@@ -224,7 +221,6 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 						 enum bloom_filter_computed *computed)
 {
 	struct bloom_filter *filter;
-	int i;
 	struct diff_options diffopt;
 
 	if (computed)
@@ -267,7 +263,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 		struct pathmap_hash_entry *e;
 		struct hashmap_iter iter;
 
-		for (i = 0; i < diff_queued_diff.nr; i++) {
+		for (int i = 0; i < diff_queued_diff.nr; i++) {
 			const char *path = diff_queued_diff.queue[i]->two->path;
 
 			/*
@@ -323,7 +319,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 	cleanup:
 		hashmap_clear_and_free(&pathmap, struct pathmap_hash_entry, entry);
 	} else {
-		for (i = 0; i < diff_queued_diff.nr; i++)
+		for (int i = 0; i < diff_queued_diff.nr; i++)
 			diff_free_filepair(diff_queued_diff.queue[i]);
 		init_truncated_large_filter(filter);
 
@@ -344,13 +340,12 @@ int bloom_filter_contains(const struct bloom_filter *filter,
 			  const struct bloom_key *key,
 			  const struct bloom_filter_settings *settings)
 {
-	int i;
 	uint64_t mod = filter->len * BITS_PER_WORD;
 
 	if (!mod)
 		return -1;
 
-	for (i = 0; i < settings->num_hashes; i++) {
+	for (int i = 0; i < settings->num_hashes; i++) {
 		uint64_t hash_mod = key->hashes[i] % mod;
 		uint64_t block_pos = hash_mod / BITS_PER_WORD;
 		if (!(filter->data[block_pos] & get_bitmask(hash_mod)))
diff --git a/branch.c b/branch.c
index 6719a181bd..a2b56f701a 100644
--- a/branch.c
+++ b/branch.c
@@ -216,7 +216,6 @@ static int inherit_tracking(struct tracking *tracking, const char *orig_ref)
 {
 	const char *bare_ref;
 	struct branch *branch;
-	int i;
 
 	bare_ref = orig_ref;
 	skip_prefix(orig_ref, "refs/heads/", &bare_ref);
@@ -235,7 +234,7 @@ static int inherit_tracking(struct tracking *tracking, const char *orig_ref)
 	}
 
 	tracking->remote = branch->remote_name;
-	for (i = 0; i < branch->merge_nr; i++)
+	for (int i = 0; i < branch->merge_nr; i++)
 		string_list_append(tracking->srcs, branch->merge_name[i]);
 	return 0;
 }
diff --git a/builtin/add.c b/builtin/add.c
index ada7719561..07052ef827 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -38,9 +38,9 @@ static const char *pathspec_from_file;
 
 static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
 {
-	int i, ret = 0;
+	int ret = 0;
 
-	for (i = 0; i < the_index.cache_nr; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		struct cache_entry *ce = the_index.cache[i];
 		int err;
 
@@ -66,9 +66,9 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only)
 
 static int renormalize_tracked_files(const struct pathspec *pathspec, int flags)
 {
-	int i, retval = 0;
+	int retval = 0;
 
-	for (i = 0; i < the_index.cache_nr; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		struct cache_entry *ce = the_index.cache[i];
 
 		if (!include_sparse &&
@@ -112,7 +112,7 @@ static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec,
 static int refresh(int verbose, const struct pathspec *pathspec)
 {
 	char *seen;
-	int i, ret = 0;
+	int ret = 0;
 	char *skip_worktree_seen = NULL;
 	struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
 	int flags = REFRESH_IGNORE_SKIP_WORKTREE |
@@ -121,7 +121,7 @@ static int refresh(int verbose, const struct pathspec *pathspec)
 	seen = xcalloc(pathspec->nr, 1);
 	refresh_index(&the_index, flags, pathspec, seen,
 		      _("Unstaged changes after refreshing the index:"));
-	for (i = 0; i < pathspec->nr; i++) {
+	for (int i = 0; i < pathspec->nr; i++) {
 		if (!seen[i]) {
 			const char *path = pathspec->items[i].original;
 
@@ -485,7 +485,6 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	}
 
 	if (pathspec.nr) {
-		int i;
 		char *skip_worktree_seen = NULL;
 		struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP;
 
@@ -504,7 +503,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 			       PATHSPEC_EXCLUDE |
 			       PATHSPEC_ATTR);
 
-		for (i = 0; i < pathspec.nr; i++) {
+		for (int i = 0; i < pathspec.nr; i++) {
 			const char *path = pathspec.items[i].match;
 
 			if (pathspec.items[i].magic & PATHSPEC_EXCLUDE)
diff --git a/builtin/am.c b/builtin/am.c
index d1990d7edc..512e2a150d 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -2445,7 +2445,6 @@ int cmd_am(int argc, const char **argv, const char *prefix)
 			am_append_signoff(&state);
 	} else {
 		struct strvec paths = STRVEC_INIT;
-		int i;
 
 		/*
 		 * Handle stray state directory in the independent-run case. In
@@ -2467,7 +2466,7 @@ int cmd_am(int argc, const char **argv, const char *prefix)
 		if (resume_mode)
 			die(_("Resolve operation not in progress, we are not resuming."));
 
-		for (i = 0; i < argc; i++) {
+		for (int i = 0; i < argc; i++) {
 			if (is_absolute_path(argv[i]) || !prefix)
 				strvec_push(&paths, argv[i]);
 			else
diff --git a/builtin/annotate.c b/builtin/annotate.c
index 58ff977a23..a940f50573 100644
--- a/builtin/annotate.c
+++ b/builtin/annotate.c
@@ -10,11 +10,10 @@
 int cmd_annotate(int argc, const char **argv, const char *prefix)
 {
 	struct strvec args = STRVEC_INIT;
-	int i;
 
 	strvec_pushl(&args, "annotate", "-c", NULL);
 
-	for (i = 1; i < argc; i++) {
+	for (int i = 1; i < argc; i++) {
 		strvec_push(&args, argv[i]);
 	}
 
diff --git a/builtin/archive.c b/builtin/archive.c
index 15ee1ec7bb..34db16787e 100644
--- a/builtin/archive.c
+++ b/builtin/archive.c
@@ -25,7 +25,7 @@ static int run_remote_archiver(int argc, const char **argv,
 			       const char *remote, const char *exec,
 			       const char *name_hint)
 {
-	int fd[2], i, rv;
+	int fd[2], rv;
 	struct transport *transport;
 	struct remote *_remote;
 	struct packet_reader reader;
@@ -47,7 +47,7 @@ static int run_remote_archiver(int argc, const char **argv,
 		if (format)
 			packet_write_fmt(fd[1], "argument --format=%s\n", format);
 	}
-	for (i = 1; i < argc; i++)
+	for (int i = 1; i < argc; i++)
 		packet_write_fmt(fd[1], "argument %s\n", argv[i]);
 	packet_flush(fd[1]);
 
diff --git a/builtin/bisect.c b/builtin/bisect.c
index f69c3f7e43..74a417f334 100644
--- a/builtin/bisect.c
+++ b/builtin/bisect.c
@@ -916,7 +916,7 @@ static enum bisect_error bisect_state(struct bisect_terms *terms, int argc,
 				      const char **argv)
 {
 	const char *state;
-	int i, verify_expected = 1;
+	int verify_expected = 1;
 	struct object_id oid, expected;
 	struct oid_array revs = OID_ARRAY_INIT;
 
@@ -975,7 +975,7 @@ static enum bisect_error bisect_state(struct bisect_terms *terms, int argc,
 	if (read_ref("BISECT_EXPECTED_REV", &expected))
 		verify_expected = 0; /* Ignore invalid file contents */
 
-	for (i = 0; i < revs.nr; i++) {
+	for (int i = 0; i < revs.nr; i++) {
 		if (bisect_write(state, oid_to_hex(&revs.oid[i]), terms, 0)) {
 			oid_array_clear(&revs);
 			return BISECT_FAILED;
@@ -1083,13 +1083,12 @@ static enum bisect_error bisect_replay(struct bisect_terms *terms, const char *f
 static enum bisect_error bisect_skip(struct bisect_terms *terms, int argc,
 				     const char **argv)
 {
-	int i;
 	enum bisect_error res;
 	struct strvec argv_state = STRVEC_INIT;
 
 	strvec_push(&argv_state, "skip");
 
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		const char *dotdot = strstr(argv[i], "..");
 
 		if (dotdot) {
diff --git a/builtin/blame.c b/builtin/blame.c
index db1f56de61..b36e9bee72 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -313,7 +313,6 @@ static const char *format_time(timestamp_t time, const char *tz_str,
 	}
 	else {
 		const char *time_str;
-		size_t time_width;
 		int tz;
 		tz = atoi(tz_str);
 		time_str = show_date(time, tz, &blame_date_mode);
@@ -322,9 +321,7 @@ static const char *format_time(timestamp_t time, const char *tz_str,
 		 * Add space paddings to time_buf to display a fixed width
 		 * string, and use time_width for display width calibration.
 		 */
-		for (time_width = utf8_strwidth(time_str);
-		     time_width < blame_date_width;
-		     time_width++)
+		for (size_t time_width = utf8_strwidth(time_str); time_width < blame_date_width; time_width++)
 			strbuf_addch(&time_buf, ' ');
 	}
 	return time_buf.buf;
@@ -354,7 +351,6 @@ static void emit_porcelain(struct blame_scoreboard *sb, struct blame_entry *ent,
 			   int opt)
 {
 	int repeat = opt & OUTPUT_LINE_PORCELAIN;
-	int cnt;
 	const char *cp;
 	struct blame_origin *suspect = ent->suspect;
 	char hex[GIT_MAX_HEXSZ + 1];
@@ -368,7 +364,7 @@ static void emit_porcelain(struct blame_scoreboard *sb, struct blame_entry *ent,
 	emit_porcelain_details(suspect, repeat);
 
 	cp = blame_nth_line(sb, ent->lno);
-	for (cnt = 0; cnt < ent->num_lines; cnt++) {
+	for (int cnt = 0; cnt < ent->num_lines; cnt++) {
 		char ch;
 		if (cnt) {
 			printf("%s %d %d\n", hex,
@@ -447,7 +443,6 @@ static void determine_line_heat(struct commit_info *ci, const char **dest_color)
 
 static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int opt)
 {
-	int cnt;
 	const char *cp;
 	struct blame_origin *suspect = ent->suspect;
 	struct commit_info ci = COMMIT_INFO_INIT;
@@ -466,7 +461,7 @@ static void emit_other(struct blame_scoreboard *sb, struct blame_entry *ent, int
 		reset = GIT_COLOR_RESET;
 	}
 
-	for (cnt = 0; cnt < ent->num_lines; cnt++) {
+	for (int cnt = 0; cnt < ent->num_lines; cnt++) {
 		char ch;
 		int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? the_hash_algo->hexsz : abbrev;
 
@@ -625,11 +620,10 @@ static void find_alignment(struct blame_scoreboard *sb, int *option)
 	int longest_src_lines = 0;
 	int longest_dst_lines = 0;
 	unsigned largest_score = 0;
-	struct blame_entry *e;
 	int compute_auto_abbrev = (abbrev < 0);
 	int auto_abbrev = DEFAULT_ABBREV;
 
-	for (e = sb->ent; e; e = e->next) {
+	for (struct blame_entry *e = sb->ent; e; e = e->next) {
 		struct blame_origin *suspect = e->suspect;
 		int num;
 
diff --git a/builtin/branch.c b/builtin/branch.c
index cfb63cce5f..774e213461 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -216,7 +216,6 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 	struct object_id oid;
 	char *name = NULL;
 	const char *fmt;
-	int i;
 	int ret = 0;
 	int remote_branch = 0;
 	struct strbuf bname = STRBUF_INIT;
@@ -247,7 +246,7 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 	if (!force)
 		head_rev = lookup_commit_reference(the_repository, &head_oid);
 
-	for (i = 0; i < argc; i++, strbuf_reset(&bname)) {
+	for (int i = 0; i < argc; i++, strbuf_reset(&bname)) {
 		char *target = NULL;
 		int flags = 0;
 
@@ -339,8 +338,8 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
 
 static int calc_maxwidth(struct ref_array *refs, int remote_bonus)
 {
-	int i, max = 0;
-	for (i = 0; i < refs->nr; i++) {
+	int max = 0;
+	for (int i = 0; i < refs->nr; i++) {
 		struct ref_array_item *it = refs->items[i];
 		const char *desc = it->refname;
 		int w;
@@ -508,9 +507,7 @@ static void print_current_branch_name(void)
 static void reject_rebase_or_bisect_branch(struct worktree **worktrees,
 					   const char *target)
 {
-	int i;
-
-	for (i = 0; worktrees[i]; i++) {
+	for (int i = 0; worktrees[i]; i++) {
 		struct worktree *wt = worktrees[i];
 
 		if (!wt->is_detached)
@@ -536,9 +533,7 @@ static int replace_each_worktree_head_symref(struct worktree **worktrees,
 					     const char *logmsg)
 {
 	int ret = 0;
-	int i;
-
-	for (i = 0; worktrees[i]; i++) {
+	for (int i = 0; worktrees[i]; i++) {
 		struct ref_store *refs;
 
 		if (worktrees[i]->is_detached)
diff --git a/builtin/bugreport.c b/builtin/bugreport.c
index 3106e56a13..cff8e1624b 100644
--- a/builtin/bugreport.c
+++ b/builtin/bugreport.c
@@ -47,15 +47,13 @@ static void get_system_info(struct strbuf *sys_info)
 
 static void get_populated_hooks(struct strbuf *hook_info, int nongit)
 {
-	const char **p;
-
 	if (nongit) {
 		strbuf_addstr(hook_info,
 			_("not run from a git repository - no hooks to show\n"));
 		return;
 	}
 
-	for (p = hook_name_list; *p; p++) {
+	for (const char **p = hook_name_list; *p; p++) {
 		const char *hook = *p;
 
 		if (hook_exists(hook))
diff --git a/builtin/cat-file.c b/builtin/cat-file.c
index bbf851138e..82b6d4f2c0 100644
--- a/builtin/cat-file.c
+++ b/builtin/cat-file.c
@@ -662,12 +662,10 @@ static void dispatch_calls(struct batch_options *opt,
 		struct queued_cmd *cmd,
 		int nr)
 {
-	int i;
-
 	if (!opt->buffer_output)
 		die(_("flush is only for --buffer mode"));
 
-	for (i = 0; i < nr; i++)
+	for (int i = 0; i < nr; i++)
 		cmd[i].fn(opt, cmd[i].line, output, data);
 
 	fflush(stdout);
@@ -675,9 +673,7 @@ static void dispatch_calls(struct batch_options *opt,
 
 static void free_cmds(struct queued_cmd *cmd, size_t *nr)
 {
-	size_t i;
-
-	for (i = 0; i < *nr; i++)
+	for (size_t i = 0; i < *nr; i++)
 		FREE_AND_NULL(cmd[i].line);
 
 	*nr = 0;
diff --git a/builtin/check-attr.c b/builtin/check-attr.c
index c1da1d184e..1ea30c0670 100644
--- a/builtin/check-attr.c
+++ b/builtin/check-attr.c
@@ -35,10 +35,9 @@ static const struct option check_attr_options[] = {
 
 static void output_attr(struct attr_check *check, const char *file)
 {
-	int j;
 	int cnt = check->nr;
 
-	for (j = 0; j < cnt; j++) {
+	for (int j = 0; j < cnt; j++) {
 		const char *value = check->items[j].value;
 
 		if (ATTR_TRUE(value))
diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c
index 906cd96753..f146e3d254 100644
--- a/builtin/check-ignore.c
+++ b/builtin/check-ignore.c
@@ -75,7 +75,7 @@ static int check_ignore(struct dir_struct *dir,
 {
 	const char *full_path;
 	char *seen;
-	int num_ignored = 0, i;
+	int num_ignored = 0;
 	struct path_pattern *pattern;
 	struct pathspec pathspec;
 
@@ -104,7 +104,7 @@ static int check_ignore(struct dir_struct *dir,
 	 */
 	seen = find_pathspecs_matching_against_index(&pathspec, &the_index,
 						     PS_HEED_SKIP_WORKTREE);
-	for (i = 0; i < pathspec.nr; i++) {
+	for (int i = 0; i < pathspec.nr; i++) {
 		full_path = pathspec.items[i].match;
 		pattern = NULL;
 		if (!seen[i]) {
diff --git a/builtin/check-mailmap.c b/builtin/check-mailmap.c
index b8a05b8e07..294905528e 100644
--- a/builtin/check-mailmap.c
+++ b/builtin/check-mailmap.c
@@ -42,7 +42,6 @@ static void check_mailmap(struct string_list *mailmap, const char *contact)
 
 int cmd_check_mailmap(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	struct string_list mailmap = STRING_LIST_INIT_NODUP;
 
 	git_config(git_default_config, NULL);
@@ -53,7 +52,7 @@ int cmd_check_mailmap(int argc, const char **argv, const char *prefix)
 
 	read_mailmap(&mailmap);
 
-	for (i = 0; i < argc; ++i)
+	for (int i = 0; i < argc; ++i)
 		check_mailmap(&mailmap, argv[i]);
 	maybe_flush_or_die(stdout, "stdout");
 
diff --git a/builtin/checkout--worker.c b/builtin/checkout--worker.c
index 6b62b5375b..44264dbbe2 100644
--- a/builtin/checkout--worker.c
+++ b/builtin/checkout--worker.c
@@ -81,7 +81,7 @@ static void release_pc_item_data(struct parallel_checkout_item *pc_item)
 static void worker_loop(struct checkout *state)
 {
 	struct parallel_checkout_item *items = NULL;
-	size_t i, nr = 0, alloc = 0;
+	size_t nr = 0, alloc = 0;
 
 	while (1) {
 		int len = packet_read(0, packet_buffer, sizeof(packet_buffer),
@@ -96,7 +96,7 @@ static void worker_loop(struct checkout *state)
 		packet_to_pc_item(packet_buffer, len, &items[nr++]);
 	}
 
-	for (i = 0; i < nr; i++) {
+	for (size_t i = 0; i < nr; i++) {
 		struct parallel_checkout_item *pc_item = &items[i];
 		write_pc_item(pc_item, state);
 		report_result(pc_item);
diff --git a/builtin/checkout-index.c b/builtin/checkout-index.c
index 2e086a204d..bb3ffc27ab 100644
--- a/builtin/checkout-index.c
+++ b/builtin/checkout-index.c
@@ -137,10 +137,10 @@ static int checkout_file(const char *name, const char *prefix)
 
 static int checkout_all(const char *prefix, int prefix_length)
 {
-	int i, errs = 0;
+	int errs = 0;
 	struct cache_entry *last_ce = NULL;
 
-	for (i = 0; i < the_index.cache_nr ; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		struct cache_entry *ce = the_index.cache[i];
 
 		if (S_ISSPARSEDIR(ce->ce_mode)) {
@@ -210,7 +210,6 @@ static int option_parse_stage(const struct option *opt,
 
 int cmd_checkout_index(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	struct lock_file lock_file = LOCK_INIT;
 	int all = 0;
 	int read_from_stdin = 0;
@@ -290,7 +289,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
 		init_parallel_checkout();
 
 	/* Check out named files first */
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		const char *arg = argv[i];
 		char *p;
 
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 067c251933..1f5e2560a6 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -382,7 +382,6 @@ static int checkout_worktree(const struct checkout_opts *opts,
 	struct checkout state = CHECKOUT_INIT;
 	int nr_checkouts = 0, nr_unmerged = 0;
 	int errs = 0;
-	int pos;
 	int pc_workers, pc_threshold;
 	struct mem_pool ce_mem_pool;
 
@@ -401,7 +400,7 @@ static int checkout_worktree(const struct checkout_opts *opts,
 	if (pc_workers > 1)
 		init_parallel_checkout();
 
-	for (pos = 0; pos < the_index.cache_nr; pos++) {
+	for (int pos = 0; pos < the_index.cache_nr; pos++) {
 		struct cache_entry *ce = the_index.cache[pos];
 		if (ce->ce_flags & CE_MATCHED) {
 			if (!ce_stage(ce)) {
@@ -1290,7 +1289,6 @@ static int parse_branchname_arg(int argc, const char **argv,
 	const char *arg;
 	int dash_dash_pos;
 	int has_dash_dash = 0;
-	int i;
 
 	/*
 	 * case 1: git checkout <ref> -- [<paths>]
@@ -1344,7 +1342,7 @@ static int parse_branchname_arg(int argc, const char **argv,
 
 	arg = argv[0];
 	dash_dash_pos = -1;
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		if (opts->accept_pathspec && !strcmp(argv[i], "--")) {
 			dash_dash_pos = i;
 			break;
diff --git a/builtin/clean.c b/builtin/clean.c
index d90766cad3..2e681f2e67 100644
--- a/builtin/clean.c
+++ b/builtin/clean.c
@@ -277,8 +277,7 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
 	}
 
 	if (!*dir_gone && !quiet) {
-		int i;
-		for (i = 0; i < dels.nr; i++)
+		for (int i = 0; i < dels.nr; i++)
 			printf(dry_run ?  _(msg_would_remove) : _(msg_remove), dels.items[i].string);
 	}
 out:
@@ -408,7 +407,7 @@ static int find_unique(const char *choice, struct menu_stuff *menu_stuff)
 {
 	struct menu_item *menu_item;
 	struct string_list_item *string_list_item;
-	int i, len, found = 0;
+	int len, found = 0;
 
 	len = strlen(choice);
 	switch (menu_stuff->type) {
@@ -417,7 +416,7 @@ static int find_unique(const char *choice, struct menu_stuff *menu_stuff)
 	case MENU_STUFF_TYPE_MENU_ITEM:
 
 		menu_item = (struct menu_item *)menu_stuff->stuff;
-		for (i = 0; i < menu_stuff->nr; i++, menu_item++) {
+		for (int i = 0; i < menu_stuff->nr; i++, menu_item++) {
 			if (len == 1 && *choice == menu_item->hotkey) {
 				found = i + 1;
 				break;
@@ -439,7 +438,7 @@ static int find_unique(const char *choice, struct menu_stuff *menu_stuff)
 		break;
 	case MENU_STUFF_TYPE_STRING_LIST:
 		string_list_item = ((struct string_list *)menu_stuff->stuff)->items;
-		for (i = 0; i < menu_stuff->nr; i++, string_list_item++) {
+		for (int i = 0; i < menu_stuff->nr; i++, string_list_item++) {
 			if (!strncasecmp(choice, string_list_item->string, len)) {
 				if (found) {
 					found = 0;
@@ -479,7 +478,7 @@ static int parse_choice(struct menu_stuff *menu_stuff,
 			struct strbuf input,
 			int **chosen)
 {
-	struct strbuf **choice_list, **ptr;
+	struct strbuf **choice_list;
 	int nr = 0;
 	int i;
 
@@ -494,7 +493,7 @@ static int parse_choice(struct menu_stuff *menu_stuff,
 		choice_list = strbuf_split_max(&input, ' ', 0);
 	}
 
-	for (ptr = choice_list; *ptr; ptr++) {
+	for (struct strbuf **ptr = choice_list; *ptr; ptr++) {
 		char *p;
 		int choose = 1;
 		int bottom = 0, top = 0;
@@ -886,9 +885,9 @@ static void interactive_main_loop(void)
 
 static void correct_untracked_entries(struct dir_struct *dir)
 {
-	int src, dst, ign;
+	int dst, ign;
 
-	for (src = dst = ign = 0; src < dir->nr; src++) {
+	for (int src = dst = ign = 0; src < dir->nr; src++) {
 		/* skip paths in ignored[] that cannot be inside entries[src] */
 		while (ign < dir->ignored_nr &&
 		       0 <= cmp_dir_entry(&dir->entries[src], &dir->ignored[ign]))
diff --git a/builtin/clone.c b/builtin/clone.c
index bad1b70ce8..a1abcbdf31 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -511,8 +511,7 @@ static struct ref *wanted_peer_refs(const struct ref *refs,
 			warning(_("Could not find remote branch %s to clone."),
 				option_branch);
 		else {
-			int i;
-			for (i = 0; i < refspec->nr; i++)
+			for (int i = 0; i < refspec->nr; i++)
 				get_fetch_map(remote_head, &refspec->items[i],
 					      &tail, 0);
 
@@ -521,8 +520,7 @@ static struct ref *wanted_peer_refs(const struct ref *refs,
 		}
 		free_refs(remote_head);
 	} else {
-		int i;
-		for (i = 0; i < refspec->nr; i++)
+		for (int i = 0; i < refspec->nr; i++)
 			get_fetch_map(refs, &refspec->items[i], &tail, 0);
 	}
 
@@ -534,8 +532,6 @@ static struct ref *wanted_peer_refs(const struct ref *refs,
 
 static void write_remote_refs(const struct ref *local_refs)
 {
-	const struct ref *r;
-
 	struct ref_transaction *t;
 	struct strbuf err = STRBUF_INIT;
 
@@ -543,7 +539,7 @@ static void write_remote_refs(const struct ref *local_refs)
 	if (!t)
 		die("%s", err.buf);
 
-	for (r = local_refs; r; r = r->next) {
+	for (const struct ref *r = local_refs; r; r = r->next) {
 		if (!r->peer_ref)
 			continue;
 		if (ref_transaction_create(t, r->peer_ref->name, &r->old_oid,
@@ -560,8 +556,7 @@ static void write_remote_refs(const struct ref *local_refs)
 
 static void write_followtags(const struct ref *refs, const char *msg)
 {
-	const struct ref *ref;
-	for (ref = refs; ref; ref = ref->next) {
+	for (const struct ref *ref = refs; ref; ref = ref->next) {
 		if (!starts_with(ref->name, "refs/tags/"))
 			continue;
 		if (ends_with(ref->name, "^{}"))
@@ -826,9 +821,7 @@ static int write_one_config(const char *key, const char *value,
 
 static void write_config(struct string_list *config)
 {
-	int i;
-
-	for (i = 0; i < config->nr; i++) {
+	for (int i = 0; i < config->nr; i++) {
 		if (git_config_parse_parameter(config->items[i].string,
 					       write_one_config, NULL) < 0)
 			die(_("unable to write parameters to config file"));
diff --git a/builtin/commit-tree.c b/builtin/commit-tree.c
index 1bb7819839..4dacdefa2f 100644
--- a/builtin/commit-tree.c
+++ b/builtin/commit-tree.c
@@ -25,8 +25,7 @@ static const char *sign_commit;
 static void new_parent(struct commit *parent, struct commit_list **parents_p)
 {
 	struct object_id *oid = &parent->object.oid;
-	struct commit_list *parents;
-	for (parents = *parents_p; parents; parents = parents->next) {
+	for (struct commit_list *parents = *parents_p; parents; parents = parents->next) {
 		if (parents->item == parent) {
 			error(_("duplicate parent %s ignored"), oid_to_hex(oid));
 			return;
diff --git a/builtin/commit.c b/builtin/commit.c
index 6d1fa71676..1782909eef 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -256,7 +256,7 @@ static int commit_index_files(void)
 static int list_paths(struct string_list *list, const char *with_tree,
 		      const struct pathspec *pattern)
 {
-	int i, ret;
+	int ret;
 	char *m;
 
 	if (!pattern->nr)
@@ -272,7 +272,7 @@ static int list_paths(struct string_list *list, const char *with_tree,
 
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(&the_index);
-	for (i = 0; i < the_index.cache_nr; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		const struct cache_entry *ce = the_index.cache[i];
 		struct string_list_item *item;
 
@@ -292,8 +292,7 @@ static int list_paths(struct string_list *list, const char *with_tree,
 
 static void add_remove_files(struct string_list *list)
 {
-	int i;
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		struct stat st;
 		struct string_list_item *p = &(list->items[i]);
 
@@ -1001,11 +1000,11 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 			parent = "HEAD^1";
 
 		if (repo_get_oid(the_repository, parent, &oid)) {
-			int i, ita_nr = 0;
+			int ita_nr = 0;
 
 			/* TODO: audit for interaction with sparse-index. */
 			ensure_full_index(&the_index);
-			for (i = 0; i < the_index.cache_nr; i++)
+			for (int i = 0; i < the_index.cache_nr; i++)
 				if (ce_intent_to_add(the_index.cache[i]))
 					ita_nr++;
 			committable = the_index.cache_nr - ita_nr > 0;
diff --git a/builtin/config.c b/builtin/config.c
index b55bfae7d6..10a181daec 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -333,7 +333,6 @@ static int get_value(const char *key_, const char *regex_, unsigned flags)
 {
 	int ret = CONFIG_GENERIC_ERROR;
 	struct strbuf_list values = {NULL};
-	int i;
 
 	if (use_key_regexp) {
 		char *tl;
@@ -402,7 +401,7 @@ static int get_value(const char *key_, const char *regex_, unsigned flags)
 
 	ret = !values.nr;
 
-	for (i = 0; i < values.nr; i++) {
+	for (int i = 0; i < values.nr; i++) {
 		struct strbuf *buf = values.items + i;
 		if (do_all || i == values.nr - 1)
 			fwrite(buf->buf, 1, buf->len, stdout);
diff --git a/builtin/count-objects.c b/builtin/count-objects.c
index 2d4bb5e8d0..5e8731d3f4 100644
--- a/builtin/count-objects.c
+++ b/builtin/count-objects.c
@@ -120,14 +120,13 @@ int cmd_count_objects(int argc, const char **argv, const char *prefix)
 				      count_loose, count_cruft, NULL, NULL);
 
 	if (verbose) {
-		struct packed_git *p;
 		unsigned long num_pack = 0;
 		off_t size_pack = 0;
 		struct strbuf loose_buf = STRBUF_INIT;
 		struct strbuf pack_buf = STRBUF_INIT;
 		struct strbuf garbage_buf = STRBUF_INIT;
 
-		for (p = get_all_packs(the_repository); p; p = p->next) {
+		for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 			if (!p->pack_local)
 				continue;
 			if (open_pack_index(p))
diff --git a/builtin/credential-cache--daemon.c b/builtin/credential-cache--daemon.c
index 3a6a750a8e..09a30ceafc 100644
--- a/builtin/credential-cache--daemon.c
+++ b/builtin/credential-cache--daemon.c
@@ -34,8 +34,7 @@ static void cache_credential(struct credential *c, int timeout)
 
 static struct credential_cache_entry *lookup_credential(const struct credential *c)
 {
-	int i;
-	for (i = 0; i < entries_nr; i++) {
+	for (int i = 0; i < entries_nr; i++) {
 		struct credential *e = &entries[i].item;
 		if (credential_match(c, e, 0))
 			return &entries[i];
@@ -45,10 +44,7 @@ static struct credential_cache_entry *lookup_credential(const struct credential
 
 static void remove_credential(const struct credential *c, int match_password)
 {
-	struct credential_cache_entry *e;
-
-	int i;
-	for (i = 0; i < entries_nr; i++) {
+	struct credential_cache_entry *e;for (int i = 0; i < entries_nr; i++) {
 		e = &entries[i];
 		if (credential_match(c, &e->item, match_password))
 			e->expiration = 0;
diff --git a/builtin/describe.c b/builtin/describe.c
index d6c77a714f..59b22e27c3 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -450,8 +450,8 @@ static void describe_commit(struct object_id *oid, struct strbuf *dst)
 	if (debug) {
 		static int label_width = -1;
 		if (label_width < 0) {
-			int i, w;
-			for (i = 0; i < ARRAY_SIZE(prio_names); i++) {
+			int w;
+			for (int i = 0; i < ARRAY_SIZE(prio_names); i++) {
 				w = strlen(_(prio_names[i]));
 				if (label_width < w)
 					label_width = w;
diff --git a/builtin/diff-index.c b/builtin/diff-index.c
index 3e05260ac0..2b47986df4 100644
--- a/builtin/diff-index.c
+++ b/builtin/diff-index.c
@@ -18,7 +18,6 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
 {
 	struct rev_info rev;
 	unsigned int option = 0;
-	int i;
 	int result;
 
 	if (argc == 2 && !strcmp(argv[1], "-h"))
@@ -36,7 +35,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)
 	diff_merges_suppress_m_parsing();
 
 	argc = setup_revisions(argc, argv, &rev, NULL);
-	for (i = 1; i < argc; i++) {
+	for (int i = 1; i < argc; i++) {
 		const char *arg = argv[i];
 
 		if (!strcmp(arg, "--cached"))
diff --git a/builtin/diff.c b/builtin/diff.c
index 6e196e0c7d..f9779a4c8d 100644
--- a/builtin/diff.c
+++ b/builtin/diff.c
@@ -211,7 +211,6 @@ static void builtin_diff_combined(struct rev_info *revs,
 				  int ents, int first_non_parent)
 {
 	struct oid_array parents = OID_ARRAY_INIT;
-	int i;
 
 	if (argc > 1)
 		usage(builtin_diff_usage);
@@ -223,7 +222,7 @@ static void builtin_diff_combined(struct rev_info *revs,
 
 	diff_merges_set_dense_combined_if_unset(revs);
 
-	for (i = 0; i < ents; i++) {
+	for (int i = 0; i < ents; i++) {
 		if (i != first_non_parent)
 			oid_array_append(&parents, &ent[i].item->oid);
 	}
@@ -313,7 +312,7 @@ struct symdiff {
  */
 static void symdiff_prepare(struct rev_info *rev, struct symdiff *sym)
 {
-	int i, is_symdiff = 0, basecount = 0, othercount = 0;
+	int is_symdiff = 0, basecount = 0, othercount = 0;
 	int lpos = -1, rpos = -1, basepos = -1;
 	struct bitmap *map = NULL;
 
@@ -332,7 +331,7 @@ static void symdiff_prepare(struct rev_info *rev, struct symdiff *sym)
 	 * so we must check for SYMMETRIC_LEFT too.  The two arrays
 	 * rev->pending.objects and rev->cmdline.rev are parallel.
 	 */
-	for (i = 0; i < rev->cmdline.nr; i++) {
+	for (int i = 0; i < rev->cmdline.nr; i++) {
 		struct object *obj = rev->pending.objects[i].item;
 		switch (rev->cmdline.rev[i].whence) {
 		case REV_CMD_MERGE_BASE:
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 4693d18cc9..6cebf8f4ab 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -430,7 +430,6 @@ static const char *anonymize_oid(const char *oid_hex)
 static void show_filemodify(struct diff_queue_struct *q,
 			    struct diff_options *options UNUSED, void *data)
 {
-	int i;
 	struct string_list *changed = data;
 
 	/*
@@ -439,7 +438,7 @@ static void show_filemodify(struct diff_queue_struct *q,
 	 */
 	QSORT(q->queue, q->nr, depth_first);
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filespec *ospec = q->queue[i]->one;
 		struct diff_filespec *spec = q->queue[i]->two;
 
@@ -543,10 +542,9 @@ static const char *anonymize_refname(const char *refname)
 	};
 	static struct hashmap refs;
 	static struct strbuf anon = STRBUF_INIT;
-	int i;
 
 	strbuf_reset(&anon);
-	for (i = 0; i < ARRAY_SIZE(prefixes); i++) {
+	for (int i = 0; i < ARRAY_SIZE(prefixes); i++) {
 		if (skip_prefix(refname, prefixes[i], &refname)) {
 			strbuf_addstr(&anon, prefixes[i]);
 			break;
@@ -926,9 +924,7 @@ static struct commit *get_commit(struct rev_cmdline_entry *e, char *full_name)
 
 static void get_tags_and_duplicates(struct rev_cmdline_info *info)
 {
-	int i;
-
-	for (i = 0; i < info->nr; i++) {
+	for (int i = 0; i < info->nr; i++) {
 		struct rev_cmdline_entry *e = info->rev + i;
 		struct object_id oid;
 		struct commit *commit;
@@ -988,9 +984,7 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
 static void handle_tags_and_duplicates(struct string_list *extras)
 {
 	struct commit *commit;
-	int i;
-
-	for (i = extras->nr - 1; i >= 0; i--) {
+	for (int i = extras->nr - 1; i >= 0; i--) {
 		const char *name = extras->items[i].string;
 		struct object *object = extras->items[i].util;
 		int mark;
@@ -1050,7 +1044,6 @@ static void handle_tags_and_duplicates(struct string_list *extras)
 
 static void export_marks(char *file)
 {
-	unsigned int i;
 	uint32_t mark;
 	struct decoration_entry *deco = idnums.entries;
 	FILE *f;
@@ -1060,7 +1053,7 @@ static void export_marks(char *file)
 	if (!f)
 		die_errno("Unable to open marks file %s for writing.", file);
 
-	for (i = 0; i < idnums.size; i++) {
+	for (unsigned int i = 0; i < idnums.size; i++) {
 		if (deco->base && deco->base->type == 1) {
 			mark = ptr_to_mark(deco->decoration);
 			if (fprintf(f, ":%"PRIu32" %s\n", mark,
@@ -1135,8 +1128,7 @@ static void import_marks(char *input_file, int check_exists)
 
 static void handle_deletes(void)
 {
-	int i;
-	for (i = 0; i < refspecs.nr; i++) {
+	for (int i = 0; i < refspecs.nr; i++) {
 		struct refspec_item *refspec = &refspecs.items[i];
 		if (*refspec->src)
 			continue;
@@ -1247,9 +1239,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
 		die(_("the option '%s' requires '%s'"), "--anonymize-map", "--anonymize");
 
 	if (refspecs_list.nr) {
-		int i;
-
-		for (i = 0; i < refspecs_list.nr; i++)
+		for (int i = 0; i < refspecs_list.nr; i++)
 			refspec_append(&refspecs, refspecs_list.items[i].string);
 
 		string_list_clear(&refspecs_list, 1);
diff --git a/builtin/fast-import.c b/builtin/fast-import.c
index 92eda20683..4fd4b9284a 100644
--- a/builtin/fast-import.c
+++ b/builtin/fast-import.c
@@ -273,14 +273,13 @@ static void parse_ls(const char *p, struct branch *b);
 
 static void for_each_mark(struct mark_set *m, uintmax_t base, each_mark_fn_t callback, void *p)
 {
-	uintmax_t k;
 	if (m->shift) {
-		for (k = 0; k < 1024; k++) {
+		for (uintmax_t k = 0; k < 1024; k++) {
 			if (m->data.sets[k])
 				for_each_mark(m->data.sets[k], base + (k << m->shift), callback, p);
 		}
 	} else {
-		for (k = 0; k < 1024; k++) {
+		for (uintmax_t k = 0; k < 1024; k++) {
 			if (m->data.marked[k])
 				callback(base + k, m->data.marked[k], p);
 		}
@@ -328,7 +327,6 @@ static void write_crash_report(const char *err)
 	FILE *rpt = fopen(loc, "w");
 	struct branch *b;
 	unsigned long lu;
-	struct recent_command *rc;
 
 	if (!rpt) {
 		error_errno("can't write crash report %s", loc);
@@ -351,7 +349,7 @@ static void write_crash_report(const char *err)
 	fputc('\n', rpt);
 	fputs("Most Recent Commands Before Crash\n", rpt);
 	fputs("---------------------------------\n", rpt);
-	for (rc = cmd_hist.next; rc != &cmd_hist; rc = rc->next) {
+	for (struct recent_command *rc = cmd_hist.next; rc != &cmd_hist; rc = rc->next) {
 		if (rc->next == &cmd_hist)
 			fputs("* ", rpt);
 		else
@@ -382,11 +380,10 @@ static void write_crash_report(const char *err)
 	}
 
 	if (first_tag) {
-		struct tag *tg;
 		fputc('\n', rpt);
 		fputs("Annotated Tags\n", rpt);
 		fputs("--------------\n", rpt);
-		for (tg = first_tag; tg; tg = tg->next_tag) {
+		for (struct tag *tg = first_tag; tg; tg = tg->next_tag) {
 			fputs(oid_to_hex(&tg->oid), rpt);
 			fputc(' ', rpt);
 			fputs(tg->name, rpt);
@@ -511,8 +508,6 @@ static struct object_entry *insert_object(struct object_id *oid)
 
 static void invalidate_pack_id(unsigned int id)
 {
-	unsigned long lu;
-	struct tag *t;
 	struct hashmap_iter iter;
 	struct object_entry *e;
 
@@ -521,7 +516,7 @@ static void invalidate_pack_id(unsigned int id)
 			e->pack_id = MAX_PACK_ID;
 	}
 
-	for (lu = 0; lu < branch_table_sz; lu++) {
+	for (unsigned long lu = 0; lu < branch_table_sz; lu++) {
 		struct branch *b;
 
 		for (b = branch_table[lu]; b; b = b->table_next_branch)
@@ -529,7 +524,7 @@ static void invalidate_pack_id(unsigned int id)
 				b->pack_id = MAX_PACK_ID;
 	}
 
-	for (t = first_tag; t; t = t->next_tag)
+	for (struct tag *t = first_tag; t; t = t->next_tag)
 		if (t->pack_id == id)
 			t->pack_id = MAX_PACK_ID;
 }
@@ -606,9 +601,7 @@ static struct atom_str *to_atom(const char *s, unsigned short len)
 static struct branch *lookup_branch(const char *name)
 {
 	unsigned int hc = hc_str(name, strlen(name)) % branch_table_sz;
-	struct branch *b;
-
-	for (b = branch_table[hc]; b; b = b->table_next_branch)
+	for (struct branch *b = branch_table[hc]; b; b = b->table_next_branch)
 		if (!strcmp(name, b->name))
 			return b;
 	return NULL;
@@ -681,8 +674,7 @@ static void release_tree_content(struct tree_content *t)
 
 static void release_tree_content_recursive(struct tree_content *t)
 {
-	unsigned int i;
-	for (i = 0; i < t->entry_count; i++)
+	for (unsigned int i = 0; i < t->entry_count; i++)
 		release_tree_entry(t->entries[i]);
 	release_tree_content(t);
 }
@@ -732,12 +724,11 @@ static struct tree_content *dup_tree_content(struct tree_content *s)
 {
 	struct tree_content *d;
 	struct tree_entry *a, *b;
-	unsigned int i;
 
 	if (!s)
 		return NULL;
 	d = new_tree_content(s->entry_count);
-	for (i = 0; i < s->entry_count; i++) {
+	for (unsigned int i = 0; i < s->entry_count; i++) {
 		a = s->entries[i];
 		b = new_tree_entry();
 		memcpy(b, a, sizeof(*a));
@@ -780,12 +771,11 @@ static const char *create_index(void)
 	const char *tmpfile;
 	struct pack_idx_entry **idx, **c, **last;
 	struct object_entry *e;
-	struct object_entry_pool *o;
 
 	/* Build the table of object IDs. */
 	ALLOC_ARRAY(idx, object_count);
 	c = idx;
-	for (o = blocks; o; o = o->next_pool)
+	for (struct object_entry_pool *o = blocks; o; o = o->next_pool)
 		for (e = o->next_free; e-- != o->entries;)
 			if (pack_id == e->pack_id)
 				*c++ = &e->idx;
@@ -827,9 +817,7 @@ static char *keep_pack(const char *curr_index_name)
 static void unkeep_all_packs(void)
 {
 	struct strbuf name = STRBUF_INIT;
-	int k;
-
-	for (k = 0; k < pack_id; k++) {
+	for (int k = 0; k < pack_id; k++) {
 		struct packed_git *p = all_packs[k];
 		odb_pack_name(&name, p->hash, "keep");
 		unlink_or_warn(name.buf);
@@ -1416,7 +1404,7 @@ static int tree_content_set(
 {
 	struct tree_content *t;
 	const char *slash1;
-	unsigned int i, n;
+	unsigned int n;
 	struct tree_entry *e;
 
 	slash1 = strchrnul(p, '/');
@@ -1429,7 +1417,7 @@ static int tree_content_set(
 	if (!root->tree)
 		load_tree(root);
 	t = root->tree;
-	for (i = 0; i < t->entry_count; i++) {
+	for (unsigned int i = 0; i < t->entry_count; i++) {
 		e = t->entries[i];
 		if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
 			if (!*slash1) {
@@ -1504,7 +1492,7 @@ static int tree_content_remove(
 {
 	struct tree_content *t;
 	const char *slash1;
-	unsigned int i, n;
+	unsigned int n;
 	struct tree_entry *e;
 
 	slash1 = strchrnul(p, '/');
@@ -1519,7 +1507,7 @@ static int tree_content_remove(
 	}
 
 	t = root->tree;
-	for (i = 0; i < t->entry_count; i++) {
+	for (unsigned int i = 0; i < t->entry_count; i++) {
 		e = t->entries[i];
 		if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
 			if (*slash1 && !S_ISDIR(e->versions[1].mode))
@@ -1569,7 +1557,7 @@ static int tree_content_get(
 {
 	struct tree_content *t;
 	const char *slash1;
-	unsigned int i, n;
+	unsigned int n;
 	struct tree_entry *e;
 
 	slash1 = strchrnul(p, '/');
@@ -1586,7 +1574,7 @@ static int tree_content_get(
 	}
 
 	t = root->tree;
-	for (i = 0; i < t->entry_count; i++) {
+	for (unsigned int i = 0; i < t->entry_count; i++) {
 		e = t->entries[i];
 		if (e->name->str_len == n && !fspathncmp(p, e->name->str_dat, n)) {
 			if (!*slash1)
@@ -1658,10 +1646,9 @@ static int update_branch(struct branch *b)
 
 static void dump_branches(void)
 {
-	unsigned int i;
 	struct branch *b;
 
-	for (i = 0; i < branch_table_sz; i++) {
+	for (unsigned int i = 0; i < branch_table_sz; i++) {
 		for (b = branch_table[i]; b; b = b->table_next_branch)
 			failure |= update_branch(b);
 	}
@@ -1670,7 +1657,6 @@ static void dump_branches(void)
 static void dump_tags(void)
 {
 	static const char *msg = "fast-import";
-	struct tag *t;
 	struct strbuf ref_name = STRBUF_INIT;
 	struct strbuf err = STRBUF_INIT;
 	struct ref_transaction *transaction;
@@ -1680,7 +1666,7 @@ static void dump_tags(void)
 		failure |= error("%s", err.buf);
 		goto cleanup;
 	}
-	for (t = first_tag; t; t = t->next_tag) {
+	for (struct tag *t = first_tag; t; t = t->next_tag) {
 		strbuf_reset(&ref_name);
 		strbuf_addf(&ref_name, "refs/tags/%s", t->name);
 
@@ -2105,7 +2091,7 @@ static uintmax_t do_change_note_fanout(
 {
 	struct tree_content *t;
 	struct tree_entry *e, leaf;
-	unsigned int i, tmp_hex_oid_len, tmp_fullpath_len;
+	unsigned int tmp_hex_oid_len, tmp_fullpath_len;
 	uintmax_t num_notes = 0;
 	struct object_id oid;
 	/* hex oid + '/' between each pair of hex digits + NUL */
@@ -2116,7 +2102,7 @@ static uintmax_t do_change_note_fanout(
 		load_tree(root);
 	t = root->tree;
 
-	for (i = 0; t && i < t->entry_count; i++) {
+	for (unsigned int i = 0; t && i < t->entry_count; i++) {
 		e = t->entries[i];
 		tmp_hex_oid_len = hex_oid_len + e->name->str_len;
 		tmp_fullpath_len = fullpath_len;
diff --git a/builtin/fetch-pack.c b/builtin/fetch-pack.c
index 44c05ee86c..577d2d0db9 100644
--- a/builtin/fetch-pack.c
+++ b/builtin/fetch-pack.c
@@ -242,11 +242,9 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix UNUSED)
 	ref = fetch_pack(&args, fd, ref, sought, nr_sought,
 			 &shallow, pack_lockfiles_ptr, version);
 	if (pack_lockfiles.nr) {
-		int i;
-
 		printf("lock %s\n", pack_lockfiles.items[0].string);
 		fflush(stdout);
-		for (i = 1; i < pack_lockfiles.nr; i++)
+		for (int i = 1; i < pack_lockfiles.nr; i++)
 			warning(_("Lockfile created but not reported: %s"),
 				pack_lockfiles.items[i].string);
 	}
diff --git a/builtin/fetch.c b/builtin/fetch.c
index 3aedfd1bb6..08ebb55d0d 100644
--- a/builtin/fetch.c
+++ b/builtin/fetch.c
@@ -210,9 +210,7 @@ static void add_merge_config(struct ref **head,
 		           struct branch *branch,
 		           struct ref ***tail)
 {
-	int i;
-
-	for (i = 0; i < branch->merge_nr; i++) {
+	for (int i = 0; i < branch->merge_nr; i++) {
 		struct ref *rm, **old_tail = *tail;
 		struct refspec_item refspec;
 
@@ -331,7 +329,6 @@ static void find_non_local_tags(const struct ref *refs,
 	struct oidset fetch_oids = OIDSET_INIT;
 	struct string_list remote_refs_list = STRING_LIST_INIT_NODUP;
 	struct string_list_item *remote_ref_item;
-	const struct ref *ref;
 	struct refname_hash_entry *item = NULL;
 	const int quick_flags = OBJECT_INFO_QUICK | OBJECT_INFO_SKIP_FETCH_OBJECT;
 
@@ -350,7 +347,7 @@ static void find_non_local_tags(const struct ref *refs,
 						       add_already_queued_tags,
 						       &existing_refs);
 
-	for (ref = refs; ref; ref = ref->next) {
+	for (const struct ref *ref = refs; ref; ref = ref->next) {
 		if (!starts_with(ref->name, "refs/tags/"))
 			continue;
 
@@ -434,12 +431,10 @@ static void find_non_local_tags(const struct ref *refs,
 
 static void filter_prefetch_refspec(struct refspec *rs)
 {
-	int i;
-
 	if (!prefetch)
 		return;
 
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		struct strbuf new_dst = STRBUF_INIT;
 		char *old_dst;
 		const char *sub = NULL;
@@ -698,14 +693,13 @@ static int s_update_ref(const char *action,
 
 static int refcol_width(const struct ref *ref_map, int compact_format)
 {
-	const struct ref *ref;
 	int max, width = 10;
 
 	max = term_columns();
 	if (compact_format)
 		max = max * 2 / 3;
 
-	for (ref = ref_map; ref; ref = ref->next) {
+	for (const struct ref *ref = ref_map; ref; ref = ref->next) {
 		int rlen, llen = 0, len;
 
 		if (ref->status == REF_STATUS_REJECT_SHALLOW ||
@@ -1138,7 +1132,6 @@ static int store_updated_refs(struct display_state *display_state,
 	struct strbuf note = STRBUF_INIT;
 	const char *what, *kind;
 	struct ref *rm;
-	int want_status;
 	int summary_width = 0;
 
 	if (verbosity >= 0)
@@ -1161,9 +1154,7 @@ static int store_updated_refs(struct display_state *display_state,
 	 * merged entries are written before not-for-merge. That lets readers
 	 * use FETCH_HEAD as a refname to refer to the ref to be merged.
 	 */
-	for (want_status = FETCH_HEAD_MERGE;
-	     want_status <= FETCH_HEAD_IGNORE;
-	     want_status++) {
+	for (int want_status = FETCH_HEAD_MERGE; want_status <= FETCH_HEAD_IGNORE; want_status++) {
 		for (rm = ref_map; rm; rm = rm->next) {
 			struct ref *ref = NULL;
 
@@ -1294,7 +1285,6 @@ static int check_exist_and_connected(struct ref *ref_map)
 {
 	struct ref *rm = ref_map;
 	struct check_connected_options opt = CHECK_CONNECTED_INIT;
-	struct ref *r;
 
 	/*
 	 * If we are deepening a shallow clone we already have these
@@ -1318,7 +1308,7 @@ static int check_exist_and_connected(struct ref *ref_map)
 	 * check_connected() allows objects to merely be promised, but
 	 * we need all direct targets to exist.
 	 */
-	for (r = rm; r; r = r->next) {
+	for (struct ref *r = rm; r; r = r->next) {
 		if (!repo_has_object_file_with_flags(the_repository, &r->old_oid,
 						     OBJECT_INFO_SKIP_FETCH_OBJECT))
 			return -1;
@@ -1462,9 +1452,7 @@ static int add_oid(const char *refname UNUSED,
 static void add_negotiation_tips(struct git_transport_options *smart_options)
 {
 	struct oid_array *oids = xcalloc(1, sizeof(*oids));
-	int i;
-
-	for (i = 0; i < negotiation_tip.nr; i++) {
+	for (int i = 0; i < negotiation_tip.nr; i++) {
 		const char *s = negotiation_tip.items[i].string;
 		int old_nr;
 		if (!has_glob_specials(s)) {
@@ -1592,8 +1580,6 @@ static int do_fetch(struct transport *transport,
 	}
 
 	if (rs->nr) {
-		int i;
-
 		refspec_ref_prefixes(rs, &transport_ls_refs_options.ref_prefixes);
 
 		/*
@@ -1601,7 +1587,7 @@ static int do_fetch(struct transport *transport,
 		 * OIDs
 		 */
 		must_list_refs = 0;
-		for (i = 0; i < rs->nr; i++) {
+		for (int i = 0; i < rs->nr; i++) {
 			if (!rs->items[i].exact_sha1) {
 				must_list_refs = 1;
 				break;
@@ -1615,8 +1601,7 @@ static int do_fetch(struct transport *transport,
 					     &transport_ls_refs_options.ref_prefixes);
 		if (branch_has_merge_config(branch) &&
 		    !strcmp(branch->remote_name, transport->remote->name)) {
-			int i;
-			for (i = 0; i < branch->merge_nr; i++) {
+			for (int i = 0; i < branch->merge_nr; i++) {
 				strvec_push(&transport_ls_refs_options.ref_prefixes,
 					    branch->merge[i]->src);
 			}
@@ -1725,7 +1710,6 @@ static int do_fetch(struct transport *transport,
 
 	if (set_upstream) {
 		struct branch *branch = branch_get("HEAD");
-		struct ref *rm;
 		struct ref *source_ref = NULL;
 
 		/*
@@ -1738,7 +1722,7 @@ static int do_fetch(struct transport *transport,
 		 * request ambiguous and err on the safe side by doing
 		 * nothing and just emit a warning.
 		 */
-		for (rm = ref_map; rm; rm = rm->next) {
+		for (struct ref *rm = ref_map; rm; rm = rm->next) {
 			if (!rm->peer_ref) {
 				if (source_ref) {
 					warning(_("multiple branches detected, incompatible with --set-upstream"));
@@ -2049,7 +2033,6 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
 		     const struct fetch_config *config)
 {
 	struct refspec rs = REFSPEC_INIT_FETCH;
-	int i;
 	int exit_code;
 	int maybe_prune_tags;
 	int remote_via_config = remote_is_configured(remote, 0);
@@ -2087,7 +2070,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
 	if (maybe_prune_tags && (argc || !remote_via_config))
 		refspec_append(&rs, TAG_REFSPEC);
 
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		if (!strcmp(argv[i], "tag")) {
 			i++;
 			if (i >= argc)
diff --git a/builtin/for-each-repo.c b/builtin/for-each-repo.c
index 28186b30f5..4fc94e2b2c 100644
--- a/builtin/for-each-repo.c
+++ b/builtin/for-each-repo.c
@@ -14,14 +14,13 @@ static const char * const for_each_repo_usage[] = {
 
 static int run_command_on_repo(const char *path, int argc, const char ** argv)
 {
-	int i;
 	struct child_process child = CHILD_PROCESS_INIT;
 	char *abspath = interpolate_path(path, 0);
 
 	child.git_cmd = 1;
 	strvec_pushl(&child.args, "-C", abspath, NULL);
 
-	for (i = 0; i < argc; i++)
+	for (int i = 0; i < argc; i++)
 		strvec_push(&child.args, argv[i]);
 
 	free(abspath);
@@ -32,7 +31,7 @@ static int run_command_on_repo(const char *path, int argc, const char ** argv)
 int cmd_for_each_repo(int argc, const char **argv, const char *prefix)
 {
 	static const char *config_key = NULL;
-	int i, result = 0;
+	int result = 0;
 	const struct string_list *values;
 	int err;
 
@@ -55,7 +54,7 @@ int cmd_for_each_repo(int argc, const char **argv, const char *prefix)
 	else if (err)
 		return 0;
 
-	for (i = 0; !result && i < values->nr; i++)
+	for (int i = 0; !result && i < values->nr; i++)
 		result = run_command_on_repo(values->items[i].string, argc, argv);
 
 	return result;
diff --git a/builtin/fsck.c b/builtin/fsck.c
index a7cf94f67e..52084409d6 100644
--- a/builtin/fsck.c
+++ b/builtin/fsck.c
@@ -366,7 +366,7 @@ static void check_object(struct object *obj)
 
 static void check_connectivity(void)
 {
-	int i, max;
+	int max;
 
 	/* Traverse the pending reachable objects */
 	traverse_reachable();
@@ -396,7 +396,7 @@ static void check_connectivity(void)
 	if (verbose)
 		fprintf_ln(stderr, _("Checking connectivity (%d objects)"), max);
 
-	for (i = 0; i < max; i++) {
+	for (int i = 0; i < max; i++) {
 		struct object *obj = get_indexed_object(i);
 
 		if (obj)
@@ -561,14 +561,14 @@ static int fsck_head_link(const char *head_ref_name,
 
 static void get_default_heads(void)
 {
-	struct worktree **worktrees, **p;
+	struct worktree **worktrees;
 	const char *head_points_at;
 	struct object_id head_oid;
 
 	for_each_rawref(fsck_handle_ref, NULL);
 
 	worktrees = get_worktrees();
-	for (p = worktrees; *p; p++) {
+	for (struct worktree **p = worktrees; *p; p++) {
 		struct worktree *wt = *p;
 		struct strbuf ref = STRBUF_INIT;
 
@@ -742,7 +742,6 @@ static int fsck_head_link(const char *head_ref_name,
 
 static int fsck_cache_tree(struct cache_tree *it, const char *index_path)
 {
-	int i;
 	int err = 0;
 
 	if (verbose)
@@ -762,7 +761,7 @@ static int fsck_cache_tree(struct cache_tree *it, const char *index_path)
 		if (obj->type != OBJ_TREE)
 			err |= objerror(obj, _("non-tree in cache-tree"));
 	}
-	for (i = 0; i < it->subtree_nr; i++)
+	for (int i = 0; i < it->subtree_nr; i++)
 		err |= fsck_cache_tree(it->down[i]->cache_tree, index_path);
 	return err;
 }
@@ -809,11 +808,9 @@ static int fsck_resolve_undo(struct index_state *istate,
 static void fsck_index(struct index_state *istate, const char *index_path,
 		       int is_current_worktree)
 {
-	unsigned int i;
-
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(istate);
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (unsigned int i = 0; i < istate->cache_nr; i++) {
 		unsigned int mode;
 		struct blob *blob;
 		struct object *obj;
@@ -921,7 +918,6 @@ static struct option fsck_opts[] = {
 
 int cmd_fsck(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	struct object_directory *odb;
 
 	/* fsck knows how to handle missing promisor objects */
@@ -994,7 +990,7 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 			errors_found |= ERROR_OBJECT;
 	}
 
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		const char *arg = argv[i];
 		struct object_id oid;
 		if (!repo_get_oid(the_repository, arg, &oid)) {
@@ -1030,13 +1026,13 @@ int cmd_fsck(int argc, const char **argv, const char *prefix)
 	}
 
 	if (keep_cache_objects) {
-		struct worktree **worktrees, **p;
+		struct worktree **worktrees;
 
 		verify_index_checksum = 1;
 		verify_ce_order = 1;
 
 		worktrees = get_worktrees();
-		for (p = worktrees; *p; p++) {
+		for (struct worktree **p = worktrees; *p; p++) {
 			struct worktree *wt = *p;
 			struct index_state istate =
 				INDEX_STATE_INIT(the_repository);
diff --git a/builtin/fsmonitor--daemon.c b/builtin/fsmonitor--daemon.c
index 1593713f4c..054e79dd03 100644
--- a/builtin/fsmonitor--daemon.c
+++ b/builtin/fsmonitor--daemon.c
@@ -227,12 +227,9 @@ static enum fsmonitor_cookie_item_result with_lock__wait_for_cookie(
 static void with_lock__mark_cookies_seen(struct fsmonitor_daemon_state *state,
 					 const struct string_list *cookie_names)
 {
-	/* assert current thread holding state->main_lock */
-
-	int k;
 	int nr_seen = 0;
 
-	for (k = 0; k < cookie_names->nr; k++) {
+	for (int k = 0; k < cookie_names->nr; k++) {
 		struct fsmonitor_cookie_item key;
 		struct fsmonitor_cookie_item *cookie;
 
@@ -468,13 +465,11 @@ void fsmonitor_batch__add_path(struct fsmonitor_batch *batch,
 static void fsmonitor_batch__combine(struct fsmonitor_batch *batch_dest,
 				     const struct fsmonitor_batch *batch_src)
 {
-	size_t k;
-
 	ALLOC_GROW(batch_dest->interned_paths,
 		   batch_dest->nr + batch_src->nr + 1,
 		   batch_dest->alloc);
 
-	for (k = 0; k < batch_src->nr; k++)
+	for (size_t k = 0; k < batch_src->nr; k++)
 		batch_dest->interned_paths[batch_dest->nr++] =
 			batch_src->interned_paths[k];
 }
@@ -512,9 +507,6 @@ static struct fsmonitor_batch *with_lock__truncate_old_batches(
 	struct fsmonitor_daemon_state *state,
 	const struct fsmonitor_batch *batch_marker)
 {
-	/* assert current thread holding state->main_lock */
-
-	const struct fsmonitor_batch *batch;
 	struct fsmonitor_batch *remainder;
 
 	if (!batch_marker)
@@ -524,7 +516,7 @@ static struct fsmonitor_batch *with_lock__truncate_old_batches(
 			 batch_marker->batch_seq_nr,
 			 (uint64_t)batch_marker->pinned_time);
 
-	for (batch = batch_marker; batch; batch = batch->next) {
+	for (const struct fsmonitor_batch *batch = batch_marker; batch; batch = batch->next) {
 		time_t t;
 
 		if (!batch->pinned_time) /* an overflow batch */
diff --git a/builtin/gc.c b/builtin/gc.c
index cb80ced6cb..1151f59d76 100644
--- a/builtin/gc.c
+++ b/builtin/gc.c
@@ -80,8 +80,7 @@ static struct string_list pack_garbage = STRING_LIST_INIT_DUP;
 
 static void clean_pack_garbage(void)
 {
-	int i;
-	for (i = 0; i < pack_garbage.nr; i++)
+	for (int i = 0; i < pack_garbage.nr; i++)
 		unlink_or_warn(pack_garbage.items[i].string);
 	string_list_clear(&pack_garbage, 0);
 }
@@ -226,9 +225,9 @@ static int too_many_loose_objects(void)
 static struct packed_git *find_base_packs(struct string_list *packs,
 					  unsigned long limit)
 {
-	struct packed_git *p, *base = NULL;
+	struct packed_git *base = NULL;
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		if (!p->pack_local || p->is_cruft)
 			continue;
 		if (limit) {
@@ -1100,7 +1099,6 @@ static int maintenance_task_loose_objects(struct maintenance_run_opts *opts)
 
 static int incremental_repack_auto_condition(void)
 {
-	struct packed_git *p;
 	int incremental_repack_auto_limit = 10;
 	int count = 0;
 
@@ -1116,9 +1114,7 @@ static int incremental_repack_auto_condition(void)
 	if (incremental_repack_auto_limit < 0)
 		return 1;
 
-	for (p = get_packed_git(the_repository);
-	     count < incremental_repack_auto_limit && p;
-	     p = p->next) {
+	for (struct packed_git *p = get_packed_git(the_repository); count < incremental_repack_auto_limit && p; p = p->next) {
 		if (!p->multi_pack_index)
 			count++;
 	}
@@ -1177,11 +1173,10 @@ static off_t get_auto_pack_size(void)
 	off_t max_size = 0;
 	off_t second_largest_size = 0;
 	off_t result_size;
-	struct packed_git *p;
 	struct repository *r = the_repository;
 
 	reprepare_packed_git(r);
-	for (p = get_all_packs(r); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(r); p; p = p->next) {
 		if (p->pack_size > max_size) {
 			second_largest_size = max_size;
 			max_size = p->pack_size;
@@ -1389,14 +1384,13 @@ static void initialize_maintenance_strategy(void)
 
 static void initialize_task_config(int schedule)
 {
-	int i;
 	struct strbuf config_name = STRBUF_INIT;
 	gc_config();
 
 	if (schedule)
 		initialize_maintenance_strategy();
 
-	for (i = 0; i < TASK__COUNT; i++) {
+	for (int i = 0; i < TASK__COUNT; i++) {
 		int config_value;
 		char *config_str;
 
@@ -1423,12 +1417,12 @@ static void initialize_task_config(int schedule)
 static int task_option_parse(const struct option *opt UNUSED,
 			     const char *arg, int unset)
 {
-	int i, num_selected = 0;
+	int num_selected = 0;
 	struct maintenance_task *task = NULL;
 
 	BUG_ON_OPT_NEG(unset);
 
-	for (i = 0; i < TASK__COUNT; i++) {
+	for (int i = 0; i < TASK__COUNT; i++) {
 		if (tasks[i].selected_order >= 0)
 			num_selected++;
 		if (!strcasecmp(tasks[i].name, arg)) {
@@ -1453,7 +1447,6 @@ static int task_option_parse(const struct option *opt UNUSED,
 
 static int maintenance_run(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	struct maintenance_run_opts opts;
 	struct option builtin_maintenance_run_options[] = {
 		OPT_BOOL(0, "auto", &opts.auto_flag,
@@ -1472,7 +1465,7 @@ static int maintenance_run(int argc, const char **argv, const char *prefix)
 
 	opts.quiet = !isatty(2);
 
-	for (i = 0; i < TASK__COUNT; i++)
+	for (int i = 0; i < TASK__COUNT; i++)
 		tasks[i].selected_order = -1;
 
 	argc = parse_options(argc, argv, prefix,
@@ -2691,7 +2684,6 @@ static void validate_scheduler(enum scheduler scheduler)
 static int update_background_schedule(const struct maintenance_start_opts *opts,
 				      int enable)
 {
-	unsigned int i;
 	int result = 0;
 	struct lock_file lk;
 	char *lock_path = xstrfmt("%s/schedule", the_repository->objects->odb->path);
@@ -2701,7 +2693,7 @@ static int update_background_schedule(const struct maintenance_start_opts *opts,
 		return error(_("another process is scheduling background maintenance"));
 	}
 
-	for (i = 1; i < ARRAY_SIZE(scheduler_fn); i++) {
+	for (unsigned int i = 1; i < ARRAY_SIZE(scheduler_fn); i++) {
 		if (enable && opts->scheduler == i)
 			continue;
 		if (!scheduler_fn[i].is_available())
diff --git a/builtin/grep.c b/builtin/grep.c
index 982bcfc4b1..ebb61eec1b 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -179,9 +179,7 @@ static void work_done(struct work_item *w)
 
 static void free_repos(void)
 {
-	int i;
-
-	for (i = 0; i < repos_to_free_nr; i++) {
+	for (int i = 0; i < repos_to_free_nr; i++) {
 		repo_clear(repos_to_free[i]);
 		free(repos_to_free[i]);
 	}
@@ -250,7 +248,6 @@ static void start_threads(struct grep_opt *opt)
 static int wait_all(void)
 {
 	int hit = 0;
-	int i;
 
 	if (!HAVE_THREADS)
 		BUG("Never call this function unless you have started threads");
@@ -268,7 +265,7 @@ static int wait_all(void)
 	pthread_cond_broadcast(&cond_add);
 	grep_unlock();
 
-	for (i = 0; i < num_threads; i++) {
+	for (int i = 0; i < num_threads; i++) {
 		void *h;
 		pthread_join(threads[i], &h);
 		hit |= (int) (intptr_t) h;
@@ -418,9 +415,9 @@ static void run_pager(struct grep_opt *opt, const char *prefix)
 {
 	struct string_list *path_list = opt->output_priv;
 	struct child_process child = CHILD_PROCESS_INIT;
-	int i, status;
+	int status;
 
-	for (i = 0; i < path_list->nr; i++)
+	for (int i = 0; i < path_list->nr; i++)
 		strvec_push(&child.args, path_list->items[i].string);
 	child.dir = prefix;
 	child.use_shell = 1;
@@ -544,7 +541,6 @@ static int grep_cache(struct grep_opt *opt,
 {
 	struct repository *repo = opt->repo;
 	int hit = 0;
-	int nr;
 	struct strbuf name = STRBUF_INIT;
 	int name_base_len = 0;
 	if (repo->submodule_prefix) {
@@ -555,7 +551,7 @@ static int grep_cache(struct grep_opt *opt,
 	if (repo_read_index(repo) < 0)
 		die(_("index file corrupt"));
 
-	for (nr = 0; nr < repo->index->cache_nr; nr++) {
+	for (int nr = 0; nr < repo->index->cache_nr; nr++) {
 		const struct cache_entry *ce = repo->index->cache[nr];
 
 		if (!cached && ce_skip_worktree(ce))
@@ -726,11 +722,10 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
 static int grep_objects(struct grep_opt *opt, const struct pathspec *pathspec,
 			const struct object_array *list)
 {
-	unsigned int i;
 	int hit = 0;
 	const unsigned int nr = list->nr;
 
-	for (i = 0; i < nr; i++) {
+	for (unsigned int i = 0; i < nr; i++) {
 		struct object *real_obj;
 
 		obj_read_lock();
@@ -770,7 +765,7 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec,
 			  int exc_std, int use_index)
 {
 	struct dir_struct dir = DIR_INIT;
-	int i, hit = 0;
+	int hit = 0;
 
 	if (!use_index)
 		dir.flags |= DIR_NO_GITLINKS;
@@ -778,7 +773,7 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec,
 		setup_standard_excludes(&dir);
 
 	fill_directory(&dir, opt->repo->index, pathspec);
-	for (i = 0; i < dir.nr; i++) {
+	for (int i = 0; i < dir.nr; i++) {
 		hit |= grep_file(opt, dir.entries[i]->name);
 		if (hit && opt->status_only)
 			break;
@@ -1148,8 +1143,7 @@ int cmd_grep(int argc, const char **argv, const char *prefix)
 	 * "do what I mean" case, we verify and complain when that isn't true.
 	 */
 	if (!seen_dashdash) {
-		int j;
-		for (j = i; j < argc; j++)
+		for (int j = i; j < argc; j++)
 			verify_filename(prefix, argv[j], j == i && allow_revs);
 	}
 
diff --git a/builtin/hash-object.c b/builtin/hash-object.c
index 82ca6d2bfd..5cefac6ef8 100644
--- a/builtin/hash-object.c
+++ b/builtin/hash-object.c
@@ -112,7 +112,6 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
 		OPT_STRING( 0 , "path", &vpath, N_("file"), N_("process file as it were from this path")),
 		OPT_END()
 	};
-	int i;
 	const char *errstr = NULL;
 
 	argc = parse_options(argc, argv, prefix, hash_object_options,
@@ -153,7 +152,7 @@ int cmd_hash_object(int argc, const char **argv, const char *prefix)
 	if (hashstdin)
 		hash_fd(0, type, vpath, flags, literally);
 
-	for (i = 0 ; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		const char *arg = argv[i];
 		char *to_free = NULL;
 
diff --git a/builtin/help.c b/builtin/help.c
index dc1fbe2b98..cea3415a17 100644
--- a/builtin/help.c
+++ b/builtin/help.c
@@ -122,14 +122,11 @@ static void list_config_help(enum show_config_type type)
 		{ "receive.fsck", "<msg-id>", list_config_fsck_msg_ids },
 		{ NULL, NULL, NULL }
 	};
-	const char **p;
 	struct slot_expansion *e;
 	struct string_list keys = STRING_LIST_INIT_DUP;
 	struct string_list keys_uniq = STRING_LIST_INIT_DUP;
 	struct string_list_item *item;
-	int i;
-
-	for (p = config_name_list; *p; p++) {
+	for (const char **p = config_name_list; *p; p++) {
 		const char *var = *p;
 		struct strbuf sb = STRBUF_INIT;
 
@@ -154,7 +151,7 @@ static void list_config_help(enum show_config_type type)
 			    e->prefix, e->placeholder);
 
 	string_list_sort(&keys);
-	for (i = 0; i < keys.nr; i++) {
+	for (int i = 0; i < keys.nr; i++) {
 		const char *var = keys.items[i].string;
 		const char *wildcard, *tag, *cut;
 		const char *dot = NULL;
@@ -216,9 +213,7 @@ static enum help_format parse_help_format(const char *format)
 
 static const char *get_man_viewer_info(const char *name)
 {
-	struct man_viewer_info_list *viewer;
-
-	for (viewer = man_viewer_info_list; viewer; viewer = viewer->next)
+	for (struct man_viewer_info_list *viewer = man_viewer_info_list; viewer; viewer = viewer->next)
 	{
 		if (!strcasecmp(name, viewer->name))
 			return viewer->info;
@@ -489,11 +484,10 @@ static void exec_viewer(const char *name, const char *page)
 
 static void show_man_page(const char *page)
 {
-	struct man_viewer_list *viewer;
 	const char *fallback = getenv("GIT_MAN_VIEWER");
 
 	setup_man_path();
-	for (viewer = man_viewer_list; viewer; viewer = viewer->next)
+	for (struct man_viewer_list *viewer = man_viewer_list; viewer; viewer = viewer->next)
 	{
 		exec_viewer(viewer->name, page); /* will return when unable */
 	}
diff --git a/builtin/hook.c b/builtin/hook.c
index 5234693a94..9015f47532 100644
--- a/builtin/hook.c
+++ b/builtin/hook.c
@@ -20,7 +20,6 @@ static const char * const builtin_hook_run_usage[] = {
 
 static int run(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	struct run_hooks_opt opt = RUN_HOOKS_OPT_INIT;
 	int ignore_missing = 0;
 	const char *hook_name;
@@ -49,7 +48,7 @@ static int run(int argc, const char **argv, const char *prefix)
 		goto usage;
 
 	/* Add our arguments, start after -- */
-	for (i = 2 ; i < argc; i++)
+	for (int i = 2; i < argc; i++)
 		strvec_push(&opt.args, argv[i]);
 
 	/* Need to take into account core.hooksPath */
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index a3a37bd215..f3489b51e7 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -186,7 +186,6 @@ static inline void unlock_mutex(pthread_mutex_t *mutex)
  */
 static void init_thread(void)
 {
-	int i;
 	init_recursive_mutex(&read_mutex);
 	pthread_mutex_init(&counter_mutex, NULL);
 	pthread_mutex_init(&work_mutex, NULL);
@@ -194,7 +193,7 @@ static void init_thread(void)
 		pthread_mutex_init(&deepest_delta_mutex, NULL);
 	pthread_key_create(&key, NULL);
 	CALLOC_ARRAY(thread_data, nr_threads);
-	for (i = 0; i < nr_threads; i++) {
+	for (int i = 0; i < nr_threads; i++) {
 		thread_data[i].pack_fd = xopen(curr_pack, O_RDONLY);
 	}
 
@@ -203,7 +202,6 @@ static void init_thread(void)
 
 static void cleanup_thread(void)
 {
-	int i;
 	if (!threads_active)
 		return;
 	threads_active = 0;
@@ -212,7 +210,7 @@ static void cleanup_thread(void)
 	pthread_mutex_destroy(&work_mutex);
 	if (show_stat)
 		pthread_mutex_destroy(&deepest_delta_mutex);
-	for (i = 0; i < nr_threads; i++)
+	for (int i = 0; i < nr_threads; i++)
 		close(thread_data[i].pack_fd);
 	pthread_key_delete(key);
 	free(thread_data);
@@ -261,14 +259,14 @@ static unsigned check_object(struct object *obj)
 
 static unsigned check_objects(void)
 {
-	unsigned i, max, foreign_nr = 0;
+	unsigned max, foreign_nr = 0;
 
 	max = get_max_object_index();
 
 	if (verbose)
 		progress = start_delayed_progress(_("Checking objects"), max);
 
-	for (i = 0; i < max; i++) {
+	for (unsigned i = 0; i < max; i++) {
 		foreign_nr += check_object(get_indexed_object(i));
 		display_progress(progress, i + 1);
 	}
@@ -1627,7 +1625,6 @@ static void read_v2_anomalous_offsets(struct packed_git *p,
 				      struct pack_idx_option *opts)
 {
 	const uint32_t *idx1, *idx2;
-	uint32_t i;
 
 	/* The address of the 4-byte offset table */
 	idx1 = (((const uint32_t *)((const uint8_t *)p->index_data + p->crc_offset))
@@ -1637,7 +1634,7 @@ static void read_v2_anomalous_offsets(struct packed_git *p,
 	/* The address of the 8-byte offset table */
 	idx2 = idx1 + p->num_objects;
 
-	for (i = 0; i < p->num_objects; i++) {
+	for (uint32_t i = 0; i < p->num_objects; i++) {
 		uint32_t off = ntohl(idx1[i]);
 		if (!(off & 0x80000000))
 			continue;
diff --git a/builtin/interpret-trailers.c b/builtin/interpret-trailers.c
index 033bd1556c..cd6f32bbd5 100644
--- a/builtin/interpret-trailers.c
+++ b/builtin/interpret-trailers.c
@@ -130,8 +130,7 @@ int cmd_interpret_trailers(int argc, const char **argv, const char *prefix)
 			options);
 
 	if (argc) {
-		int i;
-		for (i = 0; i < argc; i++)
+		for (int i = 0; i < argc; i++)
 			process_trailers(argv[i], &opts, &trailers);
 	} else {
 		if (opts.in_place)
diff --git a/builtin/log.c b/builtin/log.c
index db1808d7c1..eb3d9f7623 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -190,7 +190,6 @@ static void cmd_log_init_defaults(struct rev_info *rev)
 
 static void set_default_decoration_filter(struct decoration_filter *decoration_filter)
 {
-	int i;
 	char *value = NULL;
 	struct string_list *include = decoration_filter->include_ref_pattern;
 	const struct string_list *config_exclude;
@@ -224,7 +223,7 @@ static void set_default_decoration_filter(struct decoration_filter *decoration_f
 	 * No command-line or config options were given, so
 	 * populate with sensible defaults.
 	 */
-	for (i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
+	for (int i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
 		if (!ref_namespace[i].decoration)
 			continue;
 
@@ -734,7 +733,6 @@ static void show_setup_revisions_tweak(struct rev_info *rev)
 int cmd_show(int argc, const char **argv, const char *prefix)
 {
 	struct rev_info rev;
-	unsigned int i;
 	struct setup_revision_opt opt;
 	struct pathspec match_all;
 	int ret = 0;
@@ -765,7 +763,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
 		return cmd_log_deinit(cmd_log_walk(&rev), &rev);
 
 	rev.diffopt.no_free = 1;
-	for (i = 0; i < rev.pending.nr && !ret; i++) {
+	for (unsigned int i = 0; i < rev.pending.nr && !ret; i++) {
 		struct object *o = rev.pending.objects[i].item;
 		const char *name = rev.pending.objects[i].name;
 		switch (o->type) {
@@ -1211,13 +1209,13 @@ static void print_signature(FILE *file)
 
 static char *find_branch_name(struct rev_info *rev)
 {
-	int i, positive = -1;
+	int positive = -1;
 	struct object_id branch_oid;
 	const struct object_id *tip_oid;
 	const char *ref, *v;
 	char *full_ref, *branch = NULL;
 
-	for (i = 0; i < rev->cmdline.nr; i++) {
+	for (int i = 0; i < rev->cmdline.nr; i++) {
 		if (rev->cmdline.rev[i].flags & UNINTERESTING)
 			continue;
 		if (positive < 0)
@@ -1760,7 +1758,6 @@ static void prepare_bases(struct base_tree_info *bases,
 	struct rev_info revs;
 	struct diff_options diffopt;
 	struct commit_base commit_base;
-	int i;
 
 	if (!base)
 		return;
@@ -1775,7 +1772,7 @@ static void prepare_bases(struct base_tree_info *bases,
 	repo_init_revisions(the_repository, &revs, NULL);
 	revs.max_parents = 1;
 	revs.topo_order = 1;
-	for (i = 0; i < total; i++) {
+	for (int i = 0; i < total; i++) {
 		list[i]->object.flags &= ~UNINTERESTING;
 		add_pending_object(&revs, &list[i]->object, "rev_list");
 		*commit_base_at(&commit_base, list[i]) = 1;
@@ -1806,8 +1803,6 @@ static void prepare_bases(struct base_tree_info *bases,
 
 static void print_bases(struct base_tree_info *bases, FILE *file)
 {
-	int i;
-
 	/* Only do this once, either for the cover or for the first one */
 	if (is_null_oid(&bases->base_commit))
 		return;
@@ -1816,7 +1811,7 @@ static void print_bases(struct base_tree_info *bases, FILE *file)
 	fprintf(file, "\nbase-commit: %s\n", oid_to_hex(&bases->base_commit));
 
 	/* Show the prerequisite patches */
-	for (i = bases->nr_patch_id - 1; i >= 0; i--)
+	for (int i = bases->nr_patch_id - 1; i >= 0; i--)
 		fprintf(file, "prerequisite-patch-id: %s\n", oid_to_hex(&bases->patch_id[i]));
 
 	free(bases->patch_id);
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index 92f94e65bf..e8ceb86599 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -163,9 +163,7 @@ static void show_dir_entry(struct index_state *istate,
 static void show_other_files(struct index_state *istate,
 			     const struct dir_struct *dir)
 {
-	int i;
-
-	for (i = 0; i < dir->nr; i++) {
+	for (int i = 0; i < dir->nr; i++) {
 		struct dir_entry *ent = dir->entries[i];
 		if (!index_name_is_other(istate, ent->name, ent->len))
 			continue;
@@ -176,8 +174,7 @@ static void show_other_files(struct index_state *istate,
 static void show_killed_files(struct index_state *istate,
 			      const struct dir_struct *dir)
 {
-	int i;
-	for (i = 0; i < dir->nr; i++) {
+	for (int i = 0; i < dir->nr; i++) {
 		struct dir_entry *ent = dir->entries[i];
 		char *cp, *sp;
 		int pos, len, killed = 0;
@@ -400,7 +397,6 @@ static void construct_fullname(struct strbuf *out, const struct repository *repo
 
 static void show_files(struct repository *repo, struct dir_struct *dir)
 {
-	int i;
 	struct strbuf fullname = STRBUF_INIT;
 
 	/* For cached/deleted files we don't need to even do the readdir */
@@ -420,7 +416,7 @@ static void show_files(struct repository *repo, struct dir_struct *dir)
 	if (!show_sparse_dirs)
 		ensure_full_index(repo->index);
 
-	for (i = 0; i < repo->index->cache_nr; i++) {
+	for (int i = 0; i < repo->index->cache_nr; i++) {
 		const struct cache_entry *ce = repo->index->cache[i];
 		struct stat st;
 		int stat_err;
@@ -571,7 +567,7 @@ static int option_parse_exclude_standard(const struct option *opt,
 
 int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
 {
-	int require_work_tree = 0, show_tag = 0, i;
+	int require_work_tree = 0, show_tag = 0;
 	char *max_prefix;
 	struct dir_struct dir = DIR_INIT;
 	struct pattern_list *pl;
@@ -663,7 +659,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix)
 	argc = parse_options(argc, argv, prefix, builtin_ls_files_options,
 			ls_files_usage, 0);
 	pl = add_pattern_list(&dir, EXC_CMDL, "--exclude option");
-	for (i = 0; i < exclude_list.nr; i++) {
+	for (int i = 0; i < exclude_list.nr; i++) {
 		add_pattern(exclude_list.items[i].string, "", 0, pl, --exclude_args);
 	}
 
diff --git a/builtin/ls-tree.c b/builtin/ls-tree.c
index e4a891337c..24d21dbad6 100644
--- a/builtin/ls-tree.c
+++ b/builtin/ls-tree.c
@@ -55,15 +55,13 @@ struct ls_tree_options {
 static int show_recursive(struct ls_tree_options *options, const char *base,
 			  size_t baselen, const char *pathname)
 {
-	int i;
-
 	if (options->ls_options & LS_RECURSIVE)
 		return 1;
 
 	if (!options->pathspec.nr)
 		return 0;
 
-	for (i = 0; i < options->pathspec.nr; i++) {
+	for (int i = 0; i < options->pathspec.nr; i++) {
 		const char *spec = options->pathspec.items[i].match;
 		size_t len, speclen;
 
@@ -341,7 +339,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
 {
 	struct object_id oid;
 	struct tree *tree;
-	int i, full_tree = 0;
+	int full_tree = 0;
 	int full_name = !prefix || !*prefix;
 	read_tree_fn_t fn = NULL;
 	enum ls_tree_cmdmode cmdmode = MODE_DEFAULT;
@@ -419,7 +417,7 @@ int cmd_ls_tree(int argc, const char **argv, const char *prefix)
 		       ~(PATHSPEC_FROMTOP | PATHSPEC_LITERAL),
 		       PATHSPEC_PREFER_CWD,
 		       prefix, argv + 1);
-	for (i = 0; i < options.pathspec.nr; i++)
+	for (int i = 0; i < options.pathspec.nr; i++)
 		options.pathspec.items[i].nowildcard_len = options.pathspec.items[i].len;
 	options.pathspec.has_wildcard = 0;
 	tree = parse_tree_indirect(&oid);
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 3af9ddb8ae..ccb52fbc4b 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -114,10 +114,9 @@ static int populate_maildir_list(struct string_list *list, const char *path)
 	struct dirent *dent;
 	char *name = NULL;
 	char *subs[] = { "cur", "new", NULL };
-	char **sub;
 	int ret = -1;
 
-	for (sub = subs; *sub; ++sub) {
+	for (char **sub = subs; *sub; ++sub) {
 		free(name);
 		name = xstrfmt("%s/%s", path, *sub);
 		if (!(dir = opendir(name))) {
@@ -172,7 +171,6 @@ static int split_maildir(const char *maildir, const char *dir,
 	char *file = NULL;
 	FILE *f = NULL;
 	int ret = -1;
-	int i;
 	struct string_list list = STRING_LIST_INIT_DUP;
 
 	list.cmp = maildir_filename_cmp;
@@ -180,7 +178,7 @@ static int split_maildir(const char *maildir, const char *dir,
 	if (populate_maildir_list(&list, maildir) < 0)
 		goto out;
 
-	for (i = 0; i < list.nr; i++) {
+	for (int i = 0; i < list.nr; i++) {
 		char *name;
 
 		free(file);
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index d26e8fbf6f..2c66380e3b 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -10,7 +10,7 @@
 
 static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
 {
-	struct commit_list *result, *r;
+	struct commit_list *result;
 
 	result = repo_get_merge_bases_many_dirty(the_repository, rev[0],
 						 rev_nr - 1, rev + 1);
@@ -18,7 +18,7 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
 	if (!result)
 		return 1;
 
-	for (r = result; r; r = r->next) {
+	for (struct commit_list *r = result; r; r = r->next) {
 		printf("%s\n", oid_to_hex(&r->item->object.oid));
 		if (!show_all)
 			break;
@@ -53,10 +53,8 @@ static struct commit *get_commit_reference(const char *arg)
 
 static int handle_independent(int count, const char **args)
 {
-	struct commit_list *revs = NULL, *rev;
-	int i;
-
-	for (i = count - 1; i >= 0; i--)
+	struct commit_list *revs = NULL;
+	for (int i = count - 1; i >= 0; i--)
 		commit_list_insert(get_commit_reference(args[i]), &revs);
 
 	reduce_heads_replace(&revs);
@@ -64,7 +62,7 @@ static int handle_independent(int count, const char **args)
 	if (!revs)
 		return 1;
 
-	for (rev = revs; rev; rev = rev->next)
+	for (struct commit_list *rev = revs; rev; rev = rev->next)
 		printf("%s\n", oid_to_hex(&rev->item->object.oid));
 
 	free_commit_list(revs);
@@ -74,10 +72,8 @@ static int handle_independent(int count, const char **args)
 static int handle_octopus(int count, const char **args, int show_all)
 {
 	struct commit_list *revs = NULL;
-	struct commit_list *result, *rev;
-	int i;
-
-	for (i = count - 1; i >= 0; i--)
+	struct commit_list *result;
+	for (int i = count - 1; i >= 0; i--)
 		commit_list_insert(get_commit_reference(args[i]), &revs);
 
 	result = get_octopus_merge_bases(revs);
@@ -87,7 +83,7 @@ static int handle_octopus(int count, const char **args, int show_all)
 	if (!result)
 		return 1;
 
-	for (rev = result; rev; rev = rev->next) {
+	for (struct commit_list *rev = result; rev; rev = rev->next) {
 		printf("%s\n", oid_to_hex(&rev->item->object.oid));
 		if (!show_all)
 			break;
diff --git a/builtin/merge-index.c b/builtin/merge-index.c
index 270d5f644a..39a0535d56 100644
--- a/builtin/merge-index.c
+++ b/builtin/merge-index.c
@@ -63,10 +63,9 @@ static void merge_one_path(const char *path)
 
 static void merge_all(void)
 {
-	int i;
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(&the_index);
-	for (i = 0; i < the_index.cache_nr; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		const struct cache_entry *ce = the_index.cache[i];
 		if (!ce_stage(ce))
 			continue;
diff --git a/builtin/merge-tree.c b/builtin/merge-tree.c
index cbd8e15af6..72e0844ad1 100644
--- a/builtin/merge-tree.c
+++ b/builtin/merge-tree.c
@@ -109,8 +109,7 @@ static void *origin(struct merge_list *entry, unsigned long *size)
 
 static int show_outf(void *priv UNUSED, mmbuffer_t *mb, int nbuf)
 {
-	int i;
-	for (i = 0; i < nbuf; i++)
+	for (int i = 0; i < nbuf; i++)
 		printf("%.*s", (int) mb[i].size, mb[i].ptr);
 	return 0;
 }
@@ -267,10 +266,9 @@ static struct merge_list *link_entry(unsigned stage, const struct traverse_info
 static void unresolved(const struct traverse_info *info, struct name_entry n[3])
 {
 	struct merge_list *entry = NULL;
-	int i;
 	unsigned dirmask = 0, mask = 0;
 
-	for (i = 0; i < 3; i++) {
+	for (int i = 0; i < 3; i++) {
 		mask |= (1 << i);
 		/*
 		 * Treat missing entries as directories so that we return
@@ -490,10 +488,9 @@ static int real_merge(struct merge_tree_options *o,
 	if (!result.clean) {
 		struct string_list conflicted_files = STRING_LIST_INIT_NODUP;
 		const char *last = NULL;
-		int i;
 
 		merge_get_conflicted_files(&result, &conflicted_files);
-		for (i = 0; i < conflicted_files.nr; i++) {
+		for (int i = 0; i < conflicted_files.nr; i++) {
 			const char *name = conflicted_files.items[i].string;
 			struct stage_info *c = conflicted_files.items[i].util;
 			if (!o->name_only)
diff --git a/builtin/merge.c b/builtin/merge.c
index 935c8a57dd..df0650348d 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -393,7 +393,6 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
 {
 	struct rev_info rev;
 	struct strbuf out = STRBUF_INIT;
-	struct commit_list *j;
 	struct pretty_print_context ctx = {0};
 
 	printf(_("Squash commit -- not updating HEAD\n"));
@@ -405,7 +404,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
 	commit->object.flags |= UNINTERESTING;
 	add_pending_object(&rev, &commit->object, NULL);
 
-	for (j = remoteheads; j; j = j->next)
+	for (struct commit_list *j = remoteheads; j; j = j->next)
 		add_pending_object(&rev, &j->item->object, NULL);
 
 	setup_revisions(0, NULL, &rev, NULL);
@@ -650,7 +649,7 @@ static int git_merge_config(const char *k, const char *v,
 static int read_tree_trivial(struct object_id *common, struct object_id *head,
 			     struct object_id *one)
 {
-	int i, nr_trees = 0;
+	int nr_trees = 0;
 	struct tree *trees[MAX_UNPACK_TREES];
 	struct tree_desc t[MAX_UNPACK_TREES];
 	struct unpack_trees_options opts;
@@ -675,7 +674,7 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
 		return -1;
 	opts.fn = threeway_merge;
 	cache_tree_free(&the_index.cache_tree);
-	for (i = 0; i < nr_trees; i++) {
+	for (int i = 0; i < nr_trees; i++) {
 		parse_tree(trees[i]);
 		init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
 	}
@@ -704,11 +703,10 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
 	if (!strcmp(strategy, "recursive") || !strcmp(strategy, "subtree") ||
 	    !strcmp(strategy, "ort")) {
 		struct lock_file lock = LOCK_INIT;
-		int clean, x;
+		int clean;
 		struct commit *result;
 		struct commit_list *reversed = NULL;
 		struct merge_options o;
-		struct commit_list *j;
 
 		if (remoteheads->next) {
 			error(_("Not handling anything other than two heads merge."));
@@ -722,14 +720,14 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,
 		o.show_rename_progress =
 			show_progress == -1 ? isatty(2) : show_progress;
 
-		for (x = 0; x < xopts.nr; x++)
+		for (int x = 0; x < xopts.nr; x++)
 			if (parse_merge_opt(&o, xopts.v[x]))
 				die(_("unknown strategy option: -X%s"), xopts.v[x]);
 
 		o.branch1 = head_arg;
 		o.branch2 = merge_remote_util(remoteheads->item)->name;
 
-		for (j = common; j; j = j->next)
+		for (struct commit_list *j = common; j; j = j->next)
 			commit_list_insert(j->item, &reversed);
 
 		repo_hold_locked_index(the_repository, &lock,
@@ -765,9 +763,9 @@ static void count_diff_files(struct diff_queue_struct *q,
 
 static int count_unmerged_entries(void)
 {
-	int i, ret = 0;
+	int ret = 0;
 
-	for (i = 0; i < the_index.cache_nr; i++)
+	for (int i = 0; i < the_index.cache_nr; i++)
 		if (ce_stage(the_index.cache[i]))
 			ret++;
 
@@ -776,8 +774,6 @@ static int count_unmerged_entries(void)
 
 static void add_strategies(const char *string, unsigned attr)
 {
-	int i;
-
 	if (string) {
 		struct string_list list = STRING_LIST_INIT_DUP;
 		struct string_list_item *item;
@@ -787,7 +783,7 @@ static void add_strategies(const char *string, unsigned attr)
 		string_list_clear(&list, 0);
 		return;
 	}
-	for (i = 0; i < ARRAY_SIZE(all_strategy); i++)
+	for (int i = 0; i < ARRAY_SIZE(all_strategy); i++)
 		if (all_strategy[i].attr & attr)
 			append_strategy(&all_strategy[i]);
 
@@ -1022,10 +1018,9 @@ static int setup_with_upstream(const char ***argv)
 
 static void write_merge_heads(struct commit_list *remoteheads)
 {
-	struct commit_list *j;
 	struct strbuf buf = STRBUF_INIT;
 
-	for (j = remoteheads; j; j = j->next) {
+	for (struct commit_list *j = remoteheads; j; j = j->next) {
 		struct object_id *oid;
 		struct commit *c = j->item;
 		struct merge_remote_desc *desc;
@@ -1130,7 +1125,7 @@ static void prepare_merge_message(struct strbuf *merge_names, struct strbuf *mer
 static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge_names)
 {
 	const char *filename;
-	int fd, pos, npos;
+	int fd, npos;
 	struct strbuf fetch_head_file = STRBUF_INIT;
 	const unsigned hexsz = the_hash_algo->hexsz;
 
@@ -1145,7 +1140,7 @@ static void handle_fetch_head(struct commit_list **remotes, struct strbuf *merge
 	if (close(fd) < 0)
 		die_errno(_("could not close '%s'"), filename);
 
-	for (pos = 0; pos < merge_names->len; pos = npos) {
+	for (int pos = 0; pos < merge_names->len; pos = npos) {
 		struct object_id oid;
 		char *ptr;
 		struct commit *commit;
@@ -1209,8 +1204,7 @@ static struct commit_list *collect_parents(struct commit *head_commit,
 		}
 		remoteheads = reduce_parents(head_commit, head_subsumed, remoteheads);
 		if (autogen) {
-			struct commit_list *p;
-			for (p = remoteheads; p; p = p->next)
+			for (struct commit_list *p = remoteheads; p; p = p->next)
 				merge_name(merge_remote_util(p->item)->name, autogen);
 		}
 	}
@@ -1623,9 +1617,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix)
 		 * to date.
 		 */
 		int up_to_date = 1;
-		struct commit_list *j;
-
-		for (j = remoteheads; j; j = j->next) {
+		for (struct commit_list *j = remoteheads; j; j = j->next) {
 			struct commit_list *common_one;
 			struct commit *common_item;
 
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 2dd1807c4e..3689e898f8 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -417,14 +417,12 @@ static int name_ref(const char *path, const struct object_id *oid,
 
 static void name_tips(void)
 {
-	int i;
-
 	/*
 	 * Try to set better names first, so that worse ones spread
 	 * less.
 	 */
 	QSORT(tip_table.table, tip_table.nr, cmp_by_tag_and_age);
-	for (i = 0; i < tip_table.nr; i++) {
+	for (int i = 0; i < tip_table.nr; i++) {
 		struct tip_table_entry *e = &tip_table.table[i];
 		if (e->commit) {
 			name_rev(e->commit, e->refname, e->taggerdate,
@@ -659,10 +657,10 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
 		}
 		strbuf_release(&sb);
 	} else if (all) {
-		int i, max;
+		int max;
 
 		max = get_max_object_index();
-		for (i = 0; i < max; i++) {
+		for (int i = 0; i < max; i++) {
 			struct object *obj = get_indexed_object(i);
 			if (!obj || obj->type != OBJ_COMMIT)
 				continue;
@@ -670,8 +668,7 @@ int cmd_name_rev(int argc, const char **argv, const char *prefix)
 				  always, allow_undefined, data.name_only);
 		}
 	} else {
-		int i;
-		for (i = 0; i < revs.nr; i++)
+		for (int i = 0; i < revs.nr; i++)
 			show_name(revs.objects[i].item, revs.objects[i].name,
 				  always, allow_undefined, data.name_only);
 	}
diff --git a/builtin/notes.c b/builtin/notes.c
index caf20fd5bd..75c57e745c 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -254,9 +254,7 @@ static void append_separator(struct strbuf *message)
 static void concat_messages(struct note_data *d)
 {
 	struct strbuf msg = STRBUF_INIT;
-	size_t i;
-
-	for (i = 0; i < d->msg_nr ; i++) {
+	for (size_t i = 0; i < d->msg_nr; i++) {
 		if (d->buf.len)
 			append_separator(&d->buf);
 		strbuf_add(&msg, d->messages[i]->buf.buf, d->messages[i]->buf.len);
diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c
index 329aeac804..3e3150198b 100644
--- a/builtin/pack-objects.c
+++ b/builtin/pack-objects.c
@@ -1549,7 +1549,6 @@ static int want_object_in_pack(const struct object_id *oid,
 {
 	int want;
 	struct list_head *pos;
-	struct multi_pack_index *m;
 
 	if (!exclude && local && has_loose_object_nonlocal(oid))
 		return 0;
@@ -1568,7 +1567,7 @@ static int want_object_in_pack(const struct object_id *oid,
 		*found_offset = 0;
 	}
 
-	for (m = get_multi_pack_index(the_repository); m; m = m->next) {
+	for (struct multi_pack_index *m = get_multi_pack_index(the_repository); m; m = m->next) {
 		struct pack_entry e;
 		if (fill_midx_entry(the_repository, oid, &e, m)) {
 			want = want_object_in_pack_one(e.p, oid, exclude, found_pack, found_offset);
@@ -1718,7 +1717,6 @@ static struct pbase_tree_cache *pbase_tree_get(const struct object_id *oid)
 	void *data;
 	unsigned long size;
 	enum object_type type;
-	int neigh;
 	int my_ix = pbase_tree_cache_ix(oid);
 	int available_ix = -1;
 
@@ -1726,7 +1724,7 @@ static struct pbase_tree_cache *pbase_tree_get(const struct object_id *oid)
 	 * your object will be found at your index or within a few
 	 * slots after that slot if it is cached.
 	 */
-	for (neigh = 0; neigh < 8; neigh++) {
+	for (int neigh = 0; neigh < 8; neigh++) {
 		ent = pbase_tree_cache[my_ix];
 		if (ent && oideq(&ent->oid, oid)) {
 			ent->ref++;
@@ -1872,7 +1870,6 @@ static int check_pbase_path(unsigned hash)
 
 static void add_preferred_base_object(const char *name)
 {
-	struct pbase_tree *it;
 	size_t cmplen;
 	unsigned hash = pack_name_hash(name);
 
@@ -1880,7 +1877,7 @@ static void add_preferred_base_object(const char *name)
 		return;
 
 	cmplen = name_cmp_len(name);
-	for (it = pbase_tree; it; it = it->next) {
+	for (struct pbase_tree *it = pbase_tree; it; it = it->next) {
 		if (cmplen == 0) {
 			add_object_entry(&it->pcache.oid, OBJ_TREE, NULL, 1);
 		}
@@ -1926,7 +1923,6 @@ static void add_preferred_base(struct object_id *oid)
 static void cleanup_preferred_base(void)
 {
 	struct pbase_tree *it;
-	unsigned i;
 
 	it = pbase_tree;
 	pbase_tree = NULL;
@@ -1937,7 +1933,7 @@ static void cleanup_preferred_base(void)
 		free(tmp);
 	}
 
-	for (i = 0; i < ARRAY_SIZE(pbase_tree_cache); i++) {
+	for (unsigned i = 0; i < ARRAY_SIZE(pbase_tree_cache); i++) {
 		if (!pbase_tree_cache[i])
 			continue;
 		free(pbase_tree_cache[i]->tree_data);
@@ -1996,9 +1992,7 @@ static int can_reuse_delta(const struct object_id *base_oid,
 
 static void prefetch_to_pack(uint32_t object_index_start) {
 	struct oid_array to_fetch = OID_ARRAY_INIT;
-	uint32_t i;
-
-	for (i = object_index_start; i < to_pack.nr_objects; i++) {
+	for (uint32_t i = object_index_start; i < to_pack.nr_objects; i++) {
 		struct object_entry *entry = to_pack.objects + i;
 
 		if (!oid_object_info_extended(the_repository,
@@ -2727,7 +2721,7 @@ static unsigned long free_unpacked(struct unpacked *n)
 static void find_deltas(struct object_entry **list, unsigned *list_size,
 			int window, int depth, unsigned *processed)
 {
-	uint32_t i, idx = 0, count = 0;
+	uint32_t idx = 0, count = 0;
 	struct unpacked *array;
 	unsigned long mem_usage = 0;
 
@@ -2859,7 +2853,7 @@ static void find_deltas(struct object_entry **list, unsigned *list_size,
 			idx = 0;
 	}
 
-	for (i = 0; i < window; ++i) {
+	for (uint32_t i = 0; i < window; ++i) {
 		free_delta_index(array[i].index);
 		free(array[i].data);
 	}
@@ -3130,7 +3124,7 @@ static int add_ref_tag(const char *tag UNUSED, const struct object_id *oid,
 static void prepare_pack(int window, int depth)
 {
 	struct object_entry **delta_list;
-	uint32_t i, nr_deltas;
+	uint32_t nr_deltas;
 	unsigned n;
 
 	if (use_delta_islands)
@@ -3154,7 +3148,7 @@ static void prepare_pack(int window, int depth)
 	ALLOC_ARRAY(delta_list, to_pack.nr_objects);
 	nr_deltas = n = 0;
 
-	for (i = 0; i < to_pack.nr_objects; i++) {
+	for (uint32_t i = 0; i < to_pack.nr_objects; i++) {
 		struct object_entry *entry = to_pack.objects + i;
 
 		if (DELTA(entry))
@@ -3630,7 +3624,6 @@ static void enumerate_cruft_objects(void)
 
 static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs)
 {
-	struct packed_git *p;
 	struct rev_info revs;
 	int ret;
 
@@ -3658,7 +3651,7 @@ static void enumerate_and_traverse_cruft_objects(struct string_list *fresh_packs
 	 * Re-mark only the fresh packs as kept so that objects in
 	 * unknown packs do not halt the reachability traversal early.
 	 */
-	for (p = get_all_packs(the_repository); p; p = p->next)
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next)
 		p->pack_keep_in_core = 0;
 	mark_pack_kept_in_core(fresh_packs, 1);
 
@@ -3677,7 +3670,6 @@ static void read_cruft_objects(void)
 	struct strbuf buf = STRBUF_INIT;
 	struct string_list discard_packs = STRING_LIST_INIT_DUP;
 	struct string_list fresh_packs = STRING_LIST_INIT_DUP;
-	struct packed_git *p;
 
 	ignore_packed_keep_in_core = 1;
 
@@ -3694,7 +3686,7 @@ static void read_cruft_objects(void)
 	string_list_sort(&discard_packs);
 	string_list_sort(&fresh_packs);
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		const char *pack_name = pack_basename(p);
 		struct string_list_item *item;
 
@@ -3781,13 +3773,12 @@ static void show_object(struct object *obj, const char *name,
 	add_object_entry(&obj->oid, obj->type, name, 0);
 
 	if (use_delta_islands) {
-		const char *p;
 		unsigned depth;
 		struct object_entry *ent;
 
 		/* the empty string is a root tree, which is depth 0 */
 		depth = *name ? 1 : 0;
-		for (p = strchr(name, '/'); p; p = strchr(p + 1, '/'))
+		for (const char *p = strchr(name, '/'); p; p = strchr(p + 1, '/'))
 			depth++;
 
 		ent = packlist_find(&to_pack, &obj->oid);
@@ -3981,12 +3972,11 @@ static int loosened_object_can_be_discarded(const struct object_id *oid,
 
 static void loosen_unused_packed_objects(void)
 {
-	struct packed_git *p;
 	uint32_t i;
 	uint32_t loosened_objects_nr = 0;
 	struct object_id oid;
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		if (!p->pack_local || p->pack_keep || p->pack_keep_in_core)
 			continue;
 
@@ -4183,12 +4173,10 @@ static void get_object_list(struct rev_info *revs, int ac, const char **av)
 
 static void add_extra_kept_packs(const struct string_list *names)
 {
-	struct packed_git *p;
-
 	if (!names->nr)
 		return;
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		const char *name = basename(p->pack_name);
 		int i;
 
@@ -4545,14 +4533,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
 		if (!p) /* no keep-able packs found */
 			ignore_packed_keep_on_disk = 0;
 	}
-	if (local) {
-		/*
-		 * unlike ignore_packed_keep_on_disk above, we do not
-		 * want to unset "local" based on looking at packs, as
-		 * it also covers non-local objects
-		 */
-		struct packed_git *p;
-		for (p = get_all_packs(the_repository); p; p = p->next) {
+	if (local) {for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 			if (!p->pack_local) {
 				have_non_local_packs = 1;
 				break;
diff --git a/builtin/pack-redundant.c b/builtin/pack-redundant.c
index 4c735ba069..0891a05692 100644
--- a/builtin/pack-redundant.c
+++ b/builtin/pack-redundant.c
@@ -368,7 +368,6 @@ static int cmp_remaining_objects(const void *a, const void *b)
 static void sort_pack_list(struct pack_list **pl)
 {
 	struct pack_list **ary, *p;
-	int i;
 	size_t n = pack_list_size(*pl);
 
 	if (n < 2)
@@ -382,7 +381,7 @@ static void sort_pack_list(struct pack_list **pl)
 	QSORT(ary, n, cmp_remaining_objects);
 
 	/* link them back again */
-	for (i = 0; i < n - 1; i++)
+	for (int i = 0; i < n - 1; i++)
 		ary[i]->next = ary[i + 1];
 	ary[n - 1]->next = NULL;
 	*pl = ary[0];
diff --git a/builtin/pull.c b/builtin/pull.c
index 73a68b75b0..ff5c73ed1f 100644
--- a/builtin/pull.c
+++ b/builtin/pull.c
@@ -283,10 +283,9 @@ static void argv_push_force(struct strvec *arr)
  */
 static void set_reflog_message(int argc, const char **argv)
 {
-	int i;
 	struct strbuf msg = STRBUF_INIT;
 
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		if (i)
 			strbuf_addch(&msg, ' ');
 		strbuf_addstr(&msg, argv[i]);
@@ -937,11 +936,10 @@ static int get_can_ff(struct object_id *orig_head,
 static int already_up_to_date(struct object_id *orig_head,
 			      struct oid_array *merge_heads)
 {
-	int i;
 	struct commit *ours;
 
 	ours = lookup_commit_reference(the_repository, orig_head);
-	for (i = 0; i < merge_heads->nr; i++) {
+	for (int i = 0; i < merge_heads->nr; i++) {
 		struct commit_list *list = NULL;
 		struct commit *theirs;
 		int ok;
diff --git a/builtin/push.c b/builtin/push.c
index 2fbb31c3ad..2d4e7e329c 100644
--- a/builtin/push.c
+++ b/builtin/push.c
@@ -100,9 +100,7 @@ static void set_refspecs(const char **refs, int nr, const char *repo)
 {
 	struct remote *remote = NULL;
 	struct ref *local_refs = NULL;
-	int i;
-
-	for (i = 0; i < nr; i++) {
+	for (int i = 0; i < nr; i++) {
 		const char *ref = refs[i];
 		if (!strcmp("tag", ref)) {
 			if (nr <= ++i)
diff --git a/builtin/range-diff.c b/builtin/range-diff.c
index f02cbac087..b75283f2f5 100644
--- a/builtin/range-diff.c
+++ b/builtin/range-diff.c
@@ -39,7 +39,7 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
 		OPT_END()
 	};
 	struct option *options;
-	int i, dash_dash = -1, res = 0;
+	int dash_dash = -1, res = 0;
 	struct strbuf range1 = STRBUF_INIT, range2 = STRBUF_INIT;
 	struct object_id oid;
 	const char *three_dots = NULL;
@@ -58,7 +58,7 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)
 	if (!simple_color)
 		diffopt.use_color = 1;
 
-	for (i = 0; i < argc; i++)
+	for (int i = 0; i < argc; i++)
 		if (!strcmp(argv[i], "--")) {
 			dash_dash = i;
 			break;
diff --git a/builtin/read-tree.c b/builtin/read-tree.c
index 20e7db1973..196e87c0cd 100644
--- a/builtin/read-tree.c
+++ b/builtin/read-tree.c
@@ -88,11 +88,9 @@ static void debug_stage(const char *label, const struct cache_entry *ce,
 static int debug_merge(const struct cache_entry * const *stages,
 		       struct unpack_trees_options *o)
 {
-	int i;
-
 	printf("* %d-way merge\n", o->internal.merge_size);
 	debug_stage("index", stages[0], o);
-	for (i = 1; i <= o->internal.merge_size; i++) {
+	for (int i = 1; i <= o->internal.merge_size; i++) {
 		char buf[24];
 		xsnprintf(buf, sizeof(buf), "ent#%d", i);
 		debug_stage(buf, stages[i], o);
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index db65607485..da1ee58688 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -413,12 +413,10 @@ static void proc_receive_ref_append(const char *prefix)
 
 static int proc_receive_ref_matches(struct command *cmd)
 {
-	struct proc_receive_ref *p;
-
 	if (!proc_receive_ref)
 		return 0;
 
-	for (p = proc_receive_ref; p; p = p->next) {
+	for (struct proc_receive_ref *p = proc_receive_ref; p; p = p->next) {
 		const char *match = p->ref_prefix;
 		const char *remains;
 
@@ -547,7 +545,6 @@ static void hmac_hash(unsigned char *out,
 	unsigned char key[GIT_MAX_BLKSZ];
 	unsigned char k_ipad[GIT_MAX_BLKSZ];
 	unsigned char k_opad[GIT_MAX_BLKSZ];
-	int i;
 	git_hash_ctx ctx;
 
 	/* RFC 2104 2. (1) */
@@ -561,7 +558,7 @@ static void hmac_hash(unsigned char *out,
 	}
 
 	/* RFC 2104 2. (2) & (5) */
-	for (i = 0; i < sizeof(key); i++) {
+	for (int i = 0; i < sizeof(key); i++) {
 		k_ipad[i] = key[i] ^ 0x36;
 		k_opad[i] = key[i] ^ 0x5c;
 	}
@@ -600,9 +597,7 @@ static char *prepare_push_cert_nonce(const char *path, timestamp_t stamp)
 static int constant_memequal(const char *a, const char *b, size_t n)
 {
 	int res = 0;
-	size_t i;
-
-	for (i = 0; i < n; i++)
+	for (size_t i = 0; i < n; i++)
 		res |= a[i] ^ b[i];
 	return res;
 }
@@ -803,8 +798,7 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed,
 	proc.trace2_hook_name = hook_name;
 
 	if (feed_state->push_options) {
-		size_t i;
-		for (i = 0; i < feed_state->push_options->nr; i++)
+		for (size_t i = 0; i < feed_state->push_options->nr; i++)
 			strvec_pushf(&proc.env,
 				     "GIT_PUSH_OPTION_%"PRIuMAX"=%s",
 				     (uintmax_t)i,
@@ -958,7 +952,6 @@ static int read_proc_receive_report(struct packet_reader *reader,
 				    struct command *commands,
 				    struct strbuf *errmsg)
 {
-	struct command *cmd;
 	struct command *hint = NULL;
 	struct ref_push_report *report = NULL;
 	int new_report = 0;
@@ -1077,7 +1070,7 @@ static int read_proc_receive_report(struct packet_reader *reader,
 		new_report = 1;
 	}
 
-	for (cmd = commands; cmd; cmd = cmd->next)
+	for (struct command *cmd = commands; cmd; cmd = cmd->next)
 		if (cmd->run_proc_receive && !cmd->error_string &&
 		    !(cmd->run_proc_receive & RUN_PROC_RECEIVE_RETURNED)) {
 		    cmd->error_string = "proc-receive failed to report status";
@@ -1608,7 +1601,6 @@ static const char *update(struct command *cmd, struct shallow_info *si)
 
 static void run_update_post_hook(struct command *commands)
 {
-	struct command *cmd;
 	struct child_process proc = CHILD_PROCESS_INIT;
 	const char *hook;
 
@@ -1616,7 +1608,7 @@ static void run_update_post_hook(struct command *commands)
 	if (!hook)
 		return;
 
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		if (cmd->error_string || cmd->did_not_exist)
 			continue;
 		if (!proc.args.nr)
@@ -1728,9 +1720,7 @@ static const struct object_id *command_singleton_iterator(void *cb_data)
 static void set_connectivity_errors(struct command *commands,
 				    struct shallow_info *si)
 {
-	struct command *cmd;
-
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		struct command *singleton = cmd;
 		struct check_connected_options opt = CHECK_CONNECTED_INIT;
 
@@ -1774,12 +1764,11 @@ static void reject_updates_to_hidden(struct command *commands)
 {
 	struct strbuf refname_full = STRBUF_INIT;
 	size_t prefix_len;
-	struct command *cmd;
 
 	strbuf_addstr(&refname_full, get_git_namespace());
 	prefix_len = refname_full.len;
 
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		if (cmd->error_string)
 			continue;
 
@@ -1805,9 +1794,7 @@ static int should_process_cmd(struct command *cmd)
 static void BUG_if_skipped_connectivity_check(struct command *commands,
 					       struct shallow_info *si)
 {
-	struct command *cmd;
-
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		if (should_process_cmd(cmd) && si->shallow_ref[cmd->index])
 			bug("connectivity check has not been run on ref %s",
 			    cmd->ref_name);
@@ -1818,10 +1805,9 @@ static void BUG_if_skipped_connectivity_check(struct command *commands,
 static void execute_commands_non_atomic(struct command *commands,
 					struct shallow_info *si)
 {
-	struct command *cmd;
 	struct strbuf err = STRBUF_INIT;
 
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		if (!should_process_cmd(cmd) || cmd->run_proc_receive)
 			continue;
 
@@ -2392,12 +2378,11 @@ static void update_shallow_info(struct command *commands,
 
 static void report(struct command *commands, const char *unpack_status)
 {
-	struct command *cmd;
 	struct strbuf buf = STRBUF_INIT;
 
 	packet_buf_write(&buf, "unpack %s\n",
 			 unpack_status ? unpack_status : "ok");
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		if (!cmd->error_string)
 			packet_buf_write(&buf, "ok %s\n",
 					 cmd->ref_name);
@@ -2416,13 +2401,12 @@ static void report(struct command *commands, const char *unpack_status)
 
 static void report_v2(struct command *commands, const char *unpack_status)
 {
-	struct command *cmd;
 	struct strbuf buf = STRBUF_INIT;
 	struct ref_push_report *report;
 
 	packet_buf_write(&buf, "unpack %s\n",
 			 unpack_status ? unpack_status : "ok");
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		int count = 0;
 
 		if (cmd->error_string) {
@@ -2461,8 +2445,7 @@ static void report_v2(struct command *commands, const char *unpack_status)
 
 static int delete_only(struct command *commands)
 {
-	struct command *cmd;
-	for (cmd = commands; cmd; cmd = cmd->next) {
+	for (struct command *cmd = commands; cmd; cmd = cmd->next) {
 		if (!is_null_oid(&cmd->new_oid))
 			return 0;
 	}
@@ -2551,8 +2534,7 @@ int cmd_receive_pack(int argc, const char **argv, const char *prefix)
 		if (use_push_options)
 			read_push_options(&reader, &push_options);
 		if (!check_cert_push_options(&push_options)) {
-			struct command *cmd;
-			for (cmd = commands; cmd; cmd = cmd->next)
+			for (struct command *cmd = commands; cmd; cmd = cmd->next)
 				cmd->error_string = "inconsistent push options";
 		}
 
diff --git a/builtin/reflog.c b/builtin/reflog.c
index 2c3369fca5..bee26f2998 100644
--- a/builtin/reflog.c
+++ b/builtin/reflog.c
@@ -160,12 +160,10 @@ static int reflog_expire_config(const char *var, const char *value,
 
 static void set_reflog_expiry_param(struct cmd_reflog_expire_cb *cb, const char *ref)
 {
-	struct reflog_expire_cfg *ent;
-
 	if (cb->explicit_expiry == (EXPIRE_TOTAL|EXPIRE_UNREACH))
 		return; /* both given explicitly -- nothing to tweak */
 
-	for (ent = reflog_expire_cfg; ent; ent = ent->next) {
+	for (struct reflog_expire_cfg *ent = reflog_expire_cfg; ent; ent = ent->next) {
 		if (!wildmatch(ent->pattern, ref, 0)) {
 			if (!(cb->explicit_expiry & EXPIRE_TOTAL))
 				cb->expire_total = ent->expire_total;
@@ -242,7 +240,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
 {
 	struct cmd_reflog_expire_cb cmd = { 0 };
 	timestamp_t now = time(NULL);
-	int i, status, do_all, single_worktree = 0;
+	int status, do_all, single_worktree = 0;
 	unsigned int flags = 0;
 	int verbose = 0;
 	reflog_expiry_should_prune_fn *should_prune_fn = should_expire_reflog_ent;
@@ -313,10 +311,10 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
 			.reflogs = STRING_LIST_INIT_DUP,
 		};
 		struct string_list_item *item;
-		struct worktree **worktrees, **p;
+		struct worktree **worktrees;
 
 		worktrees = get_worktrees();
-		for (p = worktrees; *p; p++) {
+		for (struct worktree **p = worktrees; *p; p++) {
 			if (single_worktree && !(*p)->is_current)
 				continue;
 			collected.worktree = *p;
@@ -341,7 +339,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
 		string_list_clear(&collected.reflogs, 0);
 	}
 
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		char *ref;
 		struct expire_reflog_policy_cb cb = { .cmd = cmd };
 
@@ -362,7 +360,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)
 
 static int cmd_reflog_delete(int argc, const char **argv, const char *prefix)
 {
-	int i, status = 0;
+	int status = 0;
 	unsigned int flags = 0;
 	int verbose = 0;
 
@@ -384,7 +382,7 @@ static int cmd_reflog_delete(int argc, const char **argv, const char *prefix)
 	if (argc < 1)
 		return error(_("no reflog specified to delete"));
 
-	for (i = 0; i < argc; i++)
+	for (int i = 0; i < argc; i++)
 		status |= reflog_delete(argv[i], flags, verbose);
 
 	return status;
diff --git a/builtin/remote.c b/builtin/remote.c
index d91bbe728d..97a33ea644 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -366,9 +366,7 @@ static int get_ref_states(const struct ref *remote_refs, struct ref_states *stat
 {
 	struct ref *fetch_map = NULL, **tail = &fetch_map;
 	struct ref *ref, *stale_refs;
-	int i;
-
-	for (i = 0; i < states->remote->fetch.nr; i++)
+	for (int i = 0; i < states->remote->fetch.nr; i++)
 		if (get_fetch_map(remote_refs, &states->remote->fetch.items[i], &tail, 1))
 			die(_("Could not get fetch map for refspec %s"),
 				states->remote->fetch.raw[i]);
@@ -415,7 +413,7 @@ static int get_push_ref_states(const struct ref *remote_refs,
 	struct ref_states *states)
 {
 	struct remote *remote = states->remote;
-	struct ref *ref, *local_refs, *push_map;
+	struct ref *local_refs, *push_map;
 	if (remote->mirror)
 		return 0;
 
@@ -424,7 +422,7 @@ static int get_push_ref_states(const struct ref *remote_refs,
 
 	match_push_refs(local_refs, &push_map, &remote->push, MATCH_REFS_NONE);
 
-	for (ref = push_map; ref; ref = ref->next) {
+	for (struct ref *ref = push_map; ref; ref = ref->next) {
 		struct string_list_item *item;
 		struct push_info *info;
 
@@ -458,7 +456,6 @@ static int get_push_ref_states(const struct ref *remote_refs,
 
 static int get_push_ref_states_noquery(struct ref_states *states)
 {
-	int i;
 	struct remote *remote = states->remote;
 	struct string_list_item *item;
 	struct push_info *info;
@@ -472,7 +469,7 @@ static int get_push_ref_states_noquery(struct ref_states *states)
 		info->status = PUSH_STATUS_NOTQUERIED;
 		info->dest = xstrdup(item->string);
 	}
-	for (i = 0; i < remote->push.nr; i++) {
+	for (int i = 0; i < remote->push.nr; i++) {
 		const struct refspec_item *spec = &remote->push.items[i];
 		if (spec->matching)
 			item = string_list_append(&states->push, _("(matching)"));
@@ -491,7 +488,7 @@ static int get_push_ref_states_noquery(struct ref_states *states)
 
 static int get_head_names(const struct ref *remote_refs, struct ref_states *states)
 {
-	struct ref *ref, *matches;
+	struct ref *matches;
 	struct ref *fetch_map = NULL, **fetch_map_tail = &fetch_map;
 	struct refspec_item refspec;
 
@@ -502,7 +499,7 @@ static int get_head_names(const struct ref *remote_refs, struct ref_states *stat
 	get_fetch_map(remote_refs, &refspec, &fetch_map_tail, 0);
 	matches = guess_remote_head(find_ref_by_name(remote_refs, "HEAD"),
 				    fetch_map, 1);
-	for (ref = matches; ref; ref = ref->next)
+	for (struct ref *ref = matches; ref; ref = ref->next)
 		string_list_append(&states->heads, abbrev_branch(ref->name));
 
 	free_refs(fetch_map);
@@ -548,7 +545,6 @@ static int add_branch_for_removal(const char *refname,
 {
 	struct branches_for_remote *branches = cb_data;
 	struct refspec_item refspec;
-	struct known_remote *kr;
 
 	memset(&refspec, 0, sizeof(refspec));
 	refspec.dst = (char *)refname;
@@ -556,7 +552,7 @@ static int add_branch_for_removal(const char *refname,
 		return 0;
 
 	/* don't delete a branch if another remote also uses it */
-	for (kr = branches->keep->list; kr; kr = kr->next) {
+	for (struct known_remote *kr = branches->keep->list; kr; kr = kr->next) {
 		memset(&refspec, 0, sizeof(refspec));
 		refspec.dst = (char *)refname;
 		if (!remote_find_tracking(kr->remote, &refspec))
@@ -1097,7 +1093,6 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data)
 	struct branch_info *branch_info = item->util;
 	struct string_list *merge = &branch_info->merge;
 	int width = show_info->width + 4;
-	int i;
 
 	if (branch_info->rebase >= REBASE_TRUE && branch_info->merge.nr > 1) {
 		error(_("invalid branch.%s.merge; cannot rebase onto > 1 branch"),
@@ -1123,7 +1118,7 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data)
 	} else {
 		printf_ln(_("merges with remote %s"), merge->items[0].string);
 	}
-	for (i = 1; i < merge->nr; i++)
+	for (int i = 1; i < merge->nr; i++)
 		printf(_("%-*s    and with remote %s\n"), width, "",
 		       merge->items[i].string);
 
@@ -1208,7 +1203,7 @@ static int get_one_entry(struct remote *remote, void *priv)
 	struct string_list *list = priv;
 	struct strbuf remote_info_buf = STRBUF_INIT;
 	const char **url;
-	int i, url_nr;
+	int url_nr;
 
 	if (remote->url_nr > 0) {
 		struct strbuf promisor_config = STRBUF_INIT;
@@ -1231,7 +1226,7 @@ static int get_one_entry(struct remote *remote, void *priv)
 		url = remote->url;
 		url_nr = remote->url_nr;
 	}
-	for (i = 0; i < url_nr; i++)
+	for (int i = 0; i < url_nr; i++)
 	{
 		strbuf_addf(&remote_info_buf, "%s (push)", url[i]);
 		string_list_append(list, remote->name)->util =
@@ -1249,10 +1244,8 @@ static int show_all(void)
 	result = for_each_remote(get_one_entry, &list);
 
 	if (!result) {
-		int i;
-
 		string_list_sort(&list);
-		for (i = 0; i < list.nr; i++) {
+		for (int i = 0; i < list.nr; i++) {
 			struct string_list_item *item = list.items + i;
 			if (verbose)
 				printf("%s\t%s\n", item->string,
@@ -1510,7 +1503,7 @@ static int get_remote_default(const char *key, const char *value UNUSED,
 
 static int update(int argc, const char **argv, const char *prefix)
 {
-	int i, prune = -1;
+	int prune = -1;
 	struct option options[] = {
 		OPT_BOOL('p', "prune", &prune,
 			 N_("prune remotes after fetching")),
@@ -1532,7 +1525,7 @@ static int update(int argc, const char **argv, const char *prefix)
 	strvec_push(&cmd.args, "--multiple");
 	if (argc < 2)
 		strvec_push(&cmd.args, "default");
-	for (i = 1; i < argc; i++)
+	for (int i = 1; i < argc; i++)
 		strvec_push(&cmd.args, argv[i]);
 
 	if (strcmp(cmd.args.v[cmd.args.nr-1], "default") == 0) {
@@ -1665,7 +1658,7 @@ static int get_url(int argc, const char **argv, const char *prefix)
 
 static int set_url(int argc, const char **argv, const char *prefix)
 {
-	int i, push_mode = 0, add_mode = 0, delete_mode = 0;
+	int push_mode = 0, add_mode = 0, delete_mode = 0;
 	int matches = 0, negative_matches = 0;
 	const char *remotename = NULL;
 	const char *newurl = NULL;
@@ -1732,7 +1725,7 @@ static int set_url(int argc, const char **argv, const char *prefix)
 	if (regcomp(&old_regex, oldurl, REG_EXTENDED))
 		die(_("Invalid old URL pattern: %s"), oldurl);
 
-	for (i = 0; i < urlset_nr; i++)
+	for (int i = 0; i < urlset_nr; i++)
 		if (!regexec(&old_regex, urlset[i], 0, NULL, 0))
 			matches++;
 		else
diff --git a/builtin/repack.c b/builtin/repack.c
index ede36328a3..197af23c55 100644
--- a/builtin/repack.c
+++ b/builtin/repack.c
@@ -235,10 +235,9 @@ static void existing_packs_release(struct existing_packs *existing)
 static void collect_pack_filenames(struct existing_packs *existing,
 				   const struct string_list *extra_keep)
 {
-	struct packed_git *p;
 	struct strbuf buf = STRBUF_INIT;
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		int i;
 		const char *base;
 
@@ -340,9 +339,7 @@ static struct generated_pack_data *populate_pack_exts(const char *name)
 	struct stat statbuf;
 	struct strbuf path = STRBUF_INIT;
 	struct generated_pack_data *data = xcalloc(1, sizeof(*data));
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(exts); i++) {
+	for (int i = 0; i < ARRAY_SIZE(exts); i++) {
 		strbuf_reset(&path);
 		strbuf_addf(&path, "%s-%s%s", packtmp, name, exts[i].name);
 
@@ -359,8 +356,7 @@ static struct generated_pack_data *populate_pack_exts(const char *name)
 static int has_pack_ext(const struct generated_pack_data *data,
 			const char *ext)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(exts); i++) {
+	for (int i = 0; i < ARRAY_SIZE(exts); i++) {
 		if (strcmp(exts[i].name, ext))
 			continue;
 		return !!data->tempfiles[i];
@@ -460,10 +456,9 @@ static void init_pack_geometry(struct pack_geometry *geometry,
 			       struct existing_packs *existing,
 			       const struct pack_objects_args *args)
 {
-	struct packed_git *p;
 	struct strbuf buf = STRBUF_INIT;
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		if (args->local && !p->pack_local)
 			/*
 			 * When asked to only repack local packfiles we skip
@@ -592,8 +587,6 @@ static void split_pack_geometry(struct pack_geometry *geometry)
 
 static struct packed_git *get_preferred_pack(struct pack_geometry *geometry)
 {
-	uint32_t i;
-
 	if (!geometry) {
 		/*
 		 * No geometry means either an all-into-one repack (in which
@@ -614,7 +607,7 @@ static struct packed_git *get_preferred_pack(struct pack_geometry *geometry)
 	 * other words, it is the largest pack that does not get rolled up in
 	 * the geometric repack.
 	 */
-	for (i = geometry->pack_nr; i > geometry->split; i--)
+	for (uint32_t i = geometry->pack_nr; i > geometry->split; i--)
 		/*
 		 * A pack that is not local would never be included in a
 		 * multi-pack index. We thus skip over any non-local packs.
@@ -630,9 +623,7 @@ static void geometry_remove_redundant_packs(struct pack_geometry *geometry,
 					    struct existing_packs *existing)
 {
 	struct strbuf buf = STRBUF_INIT;
-	uint32_t i;
-
-	for (i = 0; i < geometry->split; i++) {
+	for (uint32_t i = 0; i < geometry->split; i++) {
 		struct packed_git *p = geometry->pack[i];
 		if (string_list_has_string(names, hash_to_hex(p->hash)))
 			continue;
@@ -734,8 +725,7 @@ static void midx_included_packs(struct string_list *include,
 		string_list_insert(include, xstrfmt("pack-%s.idx", item->string));
 	if (geometry->split_factor) {
 		struct strbuf buf = STRBUF_INIT;
-		uint32_t i;
-		for (i = geometry->split; i < geometry->pack_nr; i++) {
+		for (uint32_t i = geometry->split; i < geometry->pack_nr; i++) {
 			struct packed_git *p = geometry->pack[i];
 
 			/*
diff --git a/builtin/replace.c b/builtin/replace.c
index da59600ad2..79f2c1c337 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -109,7 +109,7 @@ typedef int (*each_replace_name_fn)(const char *name, const char *ref,
 
 static int for_each_replace_name(const char **argv, each_replace_name_fn fn)
 {
-	const char **p, *full_hex;
+	const char *full_hex;
 	struct strbuf ref = STRBUF_INIT;
 	size_t base_len;
 	int had_error = 0;
@@ -119,7 +119,7 @@ static int for_each_replace_name(const char **argv, each_replace_name_fn fn)
 	strbuf_addstr(&ref, git_replace_ref_base);
 	base_len = ref.len;
 
-	for (p = argv; *p; p++) {
+	for (const char **p = argv; *p; p++) {
 		if (repo_get_oid(the_repository, *p, &oid)) {
 			error("failed to resolve '%s' as a valid ref", *p);
 			had_error = 1;
@@ -367,7 +367,6 @@ static int replace_parents(struct strbuf *buf, int argc, const char **argv)
 {
 	struct strbuf new_parents = STRBUF_INIT;
 	const char *parent_start, *parent_end;
-	int i;
 	const unsigned hexsz = the_hash_algo->hexsz;
 
 	/* find existing parents */
@@ -379,7 +378,7 @@ static int replace_parents(struct strbuf *buf, int argc, const char **argv)
 		parent_end += hexsz + 8; /* "parent " + "hex sha1" + "\n" */
 
 	/* prepare new parents */
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		struct object_id oid;
 		struct commit *commit;
 
@@ -417,7 +416,6 @@ static int check_one_mergetag(struct commit *commit UNUSED,
 	const char *ref = mergetag_data->argv[0];
 	struct object_id tag_oid;
 	struct tag *tag;
-	int i;
 
 	hash_object_file(the_hash_algo, extra->value, extra->len,
 			 OBJ_TAG, &tag_oid);
@@ -428,7 +426,7 @@ static int check_one_mergetag(struct commit *commit UNUSED,
 		return error(_("malformed mergetag in commit '%s'"), ref);
 
 	/* iterate over new parents */
-	for (i = 1; i < mergetag_data->argc; i++) {
+	for (int i = 1; i < mergetag_data->argc; i++) {
 		struct object_id oid;
 		if (repo_get_oid(the_repository, mergetag_data->argv[i], &oid) < 0)
 			return error(_("not a valid object name: '%s'"),
diff --git a/builtin/replay.c b/builtin/replay.c
index 6bc4b47f09..624636cc6e 100644
--- a/builtin/replay.c
+++ b/builtin/replay.c
@@ -94,8 +94,6 @@ struct ref_info {
 static void get_ref_information(struct rev_cmdline_info *cmd_info,
 				struct ref_info *ref_info)
 {
-	int i;
-
 	ref_info->onto = NULL;
 	strset_init(&ref_info->positive_refs);
 	strset_init(&ref_info->negative_refs);
@@ -117,7 +115,7 @@ static void get_ref_information(struct rev_cmdline_info *cmd_info,
 	 * the second because they'd likely just be replaying commits on top
 	 * of the same commit and not making any difference.
 	 */
-	for (i = 0; i < cmd_info->nr; i++) {
+	for (int i = 0; i < cmd_info->nr; i++) {
 		struct rev_cmdline_entry *e = cmd_info->rev + i;
 		struct object_id oid;
 		const char *refexpr = e->name;
diff --git a/builtin/rerere.c b/builtin/rerere.c
index b2efc6f640..29cf9d17d2 100644
--- a/builtin/rerere.c
+++ b/builtin/rerere.c
@@ -16,8 +16,7 @@ static const char * const rerere_usage[] = {
 
 static int outf(void *dummy UNUSED, mmbuffer_t *ptr, int nbuf)
 {
-	int i;
-	for (i = 0; i < nbuf; i++)
+	for (int i = 0; i < nbuf; i++)
 		if (write_in_full(1, ptr[i].ptr, ptr[i].size) < 0)
 			return -1;
 	return 0;
diff --git a/builtin/reset.c b/builtin/reset.c
index f0bf29a478..b654c00511 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -58,7 +58,7 @@ static inline int is_merge(void)
 
 static int reset_index(const char *ref, const struct object_id *oid, int reset_type, int quiet)
 {
-	int i, nr = 0;
+	int nr = 0;
 	struct tree_desc desc[2];
 	struct tree *tree;
 	struct unpack_trees_options opts;
@@ -122,7 +122,7 @@ static int reset_index(const char *ref, const struct object_id *oid, int reset_t
 	ret = 0;
 
 out:
-	for (i = 0; i < nr; i++)
+	for (int i = 0; i < nr; i++)
 		free((void *)desc[i].buffer);
 	return ret;
 }
@@ -145,10 +145,9 @@ static void update_index_from_diff(struct diff_queue_struct *q,
 				   struct diff_options *opt UNUSED,
 				   void *data)
 {
-	int i;
 	int intent_to_add = *(int *)data;
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		int pos;
 		struct diff_filespec *one = q->queue[i]->one;
 		int is_in_reset_tree = one->mode && !is_null_oid(&one->oid);
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index b3f4783858..0aa0320756 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -742,12 +742,11 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)
 	}
 
 	if (filter_provided_objects) {
-		struct commit_list *c;
 		for (i = 0; i < revs.pending.nr; i++) {
 			struct object_array_entry *pending = revs.pending.objects + i;
 			pending->item->flags |= NOT_USER_GIVEN;
 		}
-		for (c = revs.commits; c; c = c->next)
+		for (struct commit_list *c = revs.commits; c; c = c->next)
 			c->item->object.flags |= NOT_USER_GIVEN;
 	}
 
diff --git a/builtin/rm.c b/builtin/rm.c
index fd130cea2d..fe2c0c5b7b 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -55,11 +55,10 @@ static void print_error_files(struct string_list *files_list,
 			      int *errs)
 {
 	if (files_list->nr) {
-		int i;
 		struct strbuf err_msg = STRBUF_INIT;
 
 		strbuf_addstr(&err_msg, main_msg);
-		for (i = 0; i < files_list->nr; i++)
+		for (int i = 0; i < files_list->nr; i++)
 			strbuf_addf(&err_msg,
 				    "\n    %s",
 				    files_list->items[i].string);
@@ -72,8 +71,7 @@ static void print_error_files(struct string_list *files_list,
 
 static void submodules_absorb_gitdir_if_needed(void)
 {
-	int i;
-	for (i = 0; i < list.nr; i++) {
+	for (int i = 0; i < list.nr; i++) {
 		const char *name = list.entry[i].name;
 		int pos;
 		const struct cache_entry *ce;
@@ -105,14 +103,14 @@ static int check_local_mod(struct object_id *head, int index_only)
 	 * lazy, and who cares if removal of files is a tad
 	 * slower than the theoretical maximum speed?
 	 */
-	int i, no_head;
+	int no_head;
 	int errs = 0;
 	struct string_list files_staged = STRING_LIST_INIT_NODUP;
 	struct string_list files_cached = STRING_LIST_INIT_NODUP;
 	struct string_list files_local = STRING_LIST_INIT_NODUP;
 
 	no_head = is_null_oid(head);
-	for (i = 0; i < list.nr; i++) {
+	for (int i = 0; i < list.nr; i++) {
 		struct stat st;
 		int pos;
 		const struct cache_entry *ce;
diff --git a/builtin/send-pack.c b/builtin/send-pack.c
index 3df9eaad09..30ea49318f 100644
--- a/builtin/send-pack.c
+++ b/builtin/send-pack.c
@@ -327,8 +327,7 @@ int cmd_send_pack(int argc, const char **argv, const char *prefix)
 		transport_print_push_status(dest, remote_refs, args.verbose, 0, &reject_reasons);
 
 	if (!args.dry_run && remote) {
-		struct ref *ref;
-		for (ref = remote_refs; ref; ref = ref->next)
+		for (struct ref *ref = remote_refs; ref; ref = ref->next)
 			transport_update_tracking_ref(remote, ref, args.verbose);
 	}
 
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 1307ed2b88..cf25851837 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -478,13 +478,13 @@ static void add_wrapped_shortlog_msg(struct strbuf *sb, const char *s,
 
 void shortlog_output(struct shortlog *log)
 {
-	size_t i, j;
+	size_t j;
 	struct strbuf sb = STRBUF_INIT;
 
 	if (log->sort_by_number)
 		STABLE_QSORT(log->list.items, log->list.nr,
 		      log->summary ? compare_by_counter : compare_by_list);
-	for (i = 0; i < log->list.nr; i++) {
+	for (size_t i = 0; i < log->list.nr; i++) {
 		const struct string_list_item *item = &log->list.items[i];
 		if (log->summary) {
 			fprintf(log->file, "%6d\t%s\n",
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index b01ec761d2..cd9ba4db63 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -523,9 +523,7 @@ static int show_independent(struct commit **rev,
 			    int num_rev,
 			    unsigned int *rev_mask)
 {
-	int i;
-
-	for (i = 0; i < num_rev; i++) {
+	for (int i = 0; i < num_rev; i++) {
 		struct commit *commit = rev[i];
 		unsigned int flag = rev_mask[i];
 
diff --git a/builtin/sparse-checkout.c b/builtin/sparse-checkout.c
index 0f52e25249..15460f153f 100644
--- a/builtin/sparse-checkout.c
+++ b/builtin/sparse-checkout.c
@@ -26,9 +26,7 @@ static char const * const builtin_sparse_checkout_usage[] = {
 
 static void write_patterns_to_file(FILE *fp, struct pattern_list *pl)
 {
-	int i;
-
-	for (i = 0; i < pl->nr; i++) {
+	for (int i = 0; i < pl->nr; i++) {
 		struct path_pattern *p = pl->patterns[i];
 
 		if (p->flags & PATTERN_FLAG_NEGATIVE)
@@ -79,7 +77,6 @@ static int sparse_checkout_list(int argc, const char **argv, const char *prefix)
 	}
 
 	if (pl.use_cone_patterns) {
-		int i;
 		struct pattern_entry *pe;
 		struct hashmap_iter iter;
 		struct string_list sl = STRING_LIST_INIT_DUP;
@@ -91,7 +88,7 @@ static int sparse_checkout_list(int argc, const char **argv, const char *prefix)
 
 		string_list_sort(&sl);
 
-		for (i = 0; i < sl.nr; i++) {
+		for (int i = 0; i < sl.nr; i++) {
 			quote_c_style(sl.items[i].string, NULL, stdout, 0);
 			printf("\n");
 		}
@@ -107,7 +104,7 @@ static int sparse_checkout_list(int argc, const char **argv, const char *prefix)
 
 static void clean_tracked_sparse_directories(struct repository *r)
 {
-	int i, was_full = 0;
+	int was_full = 0;
 	struct strbuf path = STRBUF_INIT;
 	size_t pathlen;
 	struct string_list_item *item;
@@ -150,7 +147,7 @@ static void clean_tracked_sparse_directories(struct repository *r)
 	 * store the entries in a list before exploring, since that might
 	 * expand the sparse-index again.
 	 */
-	for (i = 0; i < r->index->cache_nr; i++) {
+	for (int i = 0; i < r->index->cache_nr; i++) {
 		struct cache_entry *ce = r->index->cache[i];
 
 		if (S_ISSPARSEDIR(ce->ce_mode) &&
diff --git a/builtin/stash.c b/builtin/stash.c
index 7fb355bff0..0bedbe485d 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -179,10 +179,9 @@ static int get_stash_info(struct stash_info *info, int argc, const char **argv)
 	struct strbuf symbolic = STRBUF_INIT;
 
 	if (argc > 1) {
-		int i;
 		struct strbuf refs_msg = STRBUF_INIT;
 
-		for (i = 0; i < argc; i++)
+		for (int i = 0; i < argc; i++)
 			strbuf_addf(&refs_msg, " '%s'", argv[i]);
 
 		fprintf_ln(stderr, _("Too many revisions specified:%s"),
@@ -364,9 +363,7 @@ static void add_diff_to_buf(struct diff_queue_struct *q,
 			    struct diff_options *options UNUSED,
 			    void *data)
 {
-	int i;
-
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		if (is_path_a_directory(q->queue[i]->one->path))
 			continue;
 
@@ -424,7 +421,6 @@ static void unstage_changes_unless_new(struct object_id *orig_tree)
 	struct checkout state = CHECKOUT_INIT;
 	struct diff_options diff_opts;
 	struct lock_file lock = LOCK_INIT;
-	int i;
 
 	/* If any entries have skip_worktree set, we'll have to check 'em out */
 	state.force = 1;
@@ -447,7 +443,7 @@ static void unstage_changes_unless_new(struct object_id *orig_tree)
 	diffcore_std(&diff_opts);
 
 	/* Iterate over the paths that changed due to the merge... */
-	for (i = 0; i < diff_queued_diff.nr; i++) {
+	for (int i = 0; i < diff_queued_diff.nr; i++) {
 		struct diff_filepair *p;
 		struct cache_entry *ce;
 		int pos;
@@ -864,9 +860,7 @@ static void diff_include_untracked(const struct stash_info *info, struct diff_op
 	struct tree *tree[ARRAY_SIZE(oid)];
 	struct tree_desc tree_desc[ARRAY_SIZE(oid)];
 	struct unpack_trees_options unpack_tree_opt = { 0 };
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(oid); i++) {
+	for (int i = 0; i < ARRAY_SIZE(oid); i++) {
 		tree[i] = parse_tree_indirect(oid[i]);
 		if (parse_tree(tree[i]) < 0)
 			die(_("failed to parse tree"));
@@ -887,7 +881,6 @@ static void diff_include_untracked(const struct stash_info *info, struct diff_op
 
 static int show_stash(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	int ret = -1;
 	struct stash_info info = STASH_INFO_INIT;
 	struct rev_info rev;
@@ -918,7 +911,7 @@ static int show_stash(int argc, const char **argv, const char *prefix)
 			     PARSE_OPT_KEEP_DASHDASH);
 
 	strvec_push(&revision_args, argv[0]);
-	for (i = 1; i < argc; i++) {
+	for (int i = 1; i < argc; i++) {
 		if (argv[i][0] != '-')
 			strvec_push(&stash_args, argv[i]);
 		else
@@ -1049,9 +1042,7 @@ static int store_stash(int argc, const char **argv, const char *prefix)
 
 static void add_pathspecs(struct strvec *args,
 			  const struct pathspec *ps) {
-	int i;
-
-	for (i = 0; i < ps->nr; i++)
+	for (int i = 0; i < ps->nr; i++)
 		strvec_push(args, ps->items[i].original);
 }
 
@@ -1065,7 +1056,6 @@ static void add_pathspecs(struct strvec *args,
 static int get_untracked_files(const struct pathspec *ps, int include_untracked,
 			       struct strbuf *untracked_files)
 {
-	int i;
 	int found = 0;
 	struct dir_struct dir = DIR_INIT;
 
@@ -1073,7 +1063,7 @@ static int get_untracked_files(const struct pathspec *ps, int include_untracked,
 		setup_standard_excludes(&dir);
 
 	fill_directory(&dir, the_repository->index, ps);
-	for (i = 0; i < dir.nr; i++) {
+	for (int i = 0; i < dir.nr; i++) {
 		struct dir_entry *ent = dir.entries[i];
 		found++;
 		strbuf_addstr(untracked_files, ent->name);
@@ -1535,12 +1525,11 @@ static int do_push_stash(const struct pathspec *ps, const char *stash_msg, int q
 
 	repo_read_index_preload(the_repository, NULL, 0);
 	if (!include_untracked && ps->nr) {
-		int i;
 		char *ps_matched = xcalloc(ps->nr, 1);
 
 		/* TODO: audit for interaction with sparse-index. */
 		ensure_full_index(&the_index);
-		for (i = 0; i < the_index.cache_nr; i++)
+		for (int i = 0; i < the_index.cache_nr; i++)
 			ce_path_match(&the_index, the_index.cache[i], ps,
 				      ps_matched);
 
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index fda50f2af1..711a184b62 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -143,7 +143,6 @@ static char *get_submodule_displaypath(const char *path, const char *prefix,
 static char *compute_rev_name(const char *sub_path, const char* object_id)
 {
 	struct strbuf sb = STRBUF_INIT;
-	const char ***d;
 
 	static const char *describe_bare[] = { NULL };
 
@@ -157,7 +156,7 @@ static char *compute_rev_name(const char *sub_path, const char* object_id)
 						describe_contains,
 						describe_all_always, NULL };
 
-	for (d = describe_argv; *d; d++) {
+	for (const char ***d = describe_argv; *d; d++) {
 		struct child_process cp = CHILD_PROCESS_INIT;
 		prepare_submodule_repo_env(&cp.env);
 		cp.dir = sub_path;
@@ -194,7 +193,7 @@ static int module_list_compute(const char **argv,
 			       struct pathspec *pathspec,
 			       struct module_list *list)
 {
-	int i, result = 0;
+	int result = 0;
 	char *ps_matched = NULL;
 
 	parse_pathspec(pathspec, 0,
@@ -207,7 +206,7 @@ static int module_list_compute(const char **argv,
 	if (repo_read_index(the_repository) < 0)
 		die(_("index file corrupt"));
 
-	for (i = 0; i < the_index.cache_nr; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		const struct cache_entry *ce = the_index.cache[i];
 
 		if (!match_pathspec(&the_index, pathspec, ce->name, ce_namelen(ce),
@@ -236,10 +235,9 @@ static int module_list_compute(const char **argv,
 
 static void module_list_active(struct module_list *list)
 {
-	int i;
 	struct module_list active_modules = MODULE_LIST_INIT;
 
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		const struct cache_entry *ce = list->entries[i];
 
 		if (!is_submodule_active(the_repository, ce->name))
@@ -257,10 +255,9 @@ static void module_list_active(struct module_list *list)
 
 static char *get_up_path(const char *path)
 {
-	int i;
 	struct strbuf sb = STRBUF_INIT;
 
-	for (i = count_slashes(path); i; i--)
+	for (int i = count_slashes(path); i; i--)
 		strbuf_addstr(&sb, "../");
 
 	/*
@@ -277,9 +274,7 @@ static char *get_up_path(const char *path)
 static void for_each_listed_submodule(const struct module_list *list,
 				      each_submodule_fn fn, void *cb_data)
 {
-	int i;
-
-	for (i = 0; i < list->nr; i++)
+	for (int i = 0; i < list->nr; i++)
 		fn(list->entries[i], cb_data);
 }
 
@@ -787,9 +782,7 @@ struct module_cb_list {
 
 static void module_cb_list_release(struct module_cb_list *mcbl)
 {
-	int i;
-
-	for (i = 0; i < mcbl->nr; i++) {
+	for (int i = 0; i < mcbl->nr; i++) {
 		struct module_cb *mcb = mcbl->entries[i];
 
 		module_cb_release(mcb);
@@ -1021,8 +1014,7 @@ static void generate_submodule_summary(struct summary_cb *info,
 static void prepare_submodule_summary(struct summary_cb *info,
 				      struct module_cb_list *list)
 {
-	int i;
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		const struct submodule *sub;
 		struct module_cb *p = list->entries[i];
 		struct strbuf sm_gitdir = STRBUF_INIT;
@@ -1063,9 +1055,8 @@ static void submodule_summary_callback(struct diff_queue_struct *q,
 				       struct diff_options *options UNUSED,
 				       void *data)
 {
-	int i;
 	struct module_cb_list *list = data;
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		struct module_cb *temp;
 
@@ -2592,7 +2583,7 @@ static int update_submodule(struct update_data *update_data)
 
 static int update_submodules(struct update_data *update_data)
 {
-	int i, ret = 0;
+	int ret = 0;
 	struct submodule_update_clone suc = SUBMODULE_UPDATE_CLONE_INIT;
 	const struct run_process_parallel_opts opts = {
 		.tr2_category = "submodule",
@@ -2622,7 +2613,7 @@ static int update_submodules(struct update_data *update_data)
 		goto cleanup;
 	}
 
-	for (i = 0; i < suc.update_clone_nr; i++) {
+	for (int i = 0; i < suc.update_clone_nr; i++) {
 		struct update_clone_data ucd = suc.update_clone[i];
 		int code;
 
@@ -2812,13 +2803,12 @@ static int push_check(int argc, const char **argv, const char *prefix UNUSED)
 
 	/* Check the refspec */
 	if (argc > 2) {
-		int i;
 		struct ref *local_refs = get_local_heads();
 		struct refspec refspec = REFSPEC_INIT_PUSH;
 
 		refspec_appendn(&refspec, argv + 2, argc - 2);
 
-		for (i = 0; i < refspec.nr; i++) {
+		for (int i = 0; i < refspec.nr; i++) {
 			const struct refspec_item *rs = &refspec.items[i];
 
 			if (rs->pattern || rs->matching)
@@ -2855,7 +2845,6 @@ static int push_check(int argc, const char **argv, const char *prefix UNUSED)
 
 static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
 {
-	int i;
 	struct pathspec pathspec = { 0 };
 	struct module_list list = MODULE_LIST_INIT;
 	const char *super_prefix = NULL;
@@ -2875,7 +2864,7 @@ static int absorb_git_dirs(int argc, const char **argv, const char *prefix)
 	if (module_list_compute(argv, prefix, &pathspec, &list) < 0)
 		goto cleanup;
 
-	for (i = 0; i < list.nr; i++)
+	for (int i = 0; i < list.nr; i++)
 		absorb_git_dir_into_superproject(list.entries[i]->name,
 						 super_prefix);
 
@@ -3239,7 +3228,6 @@ static void die_on_index_match(const char *path, int force)
 		die(_("index file corrupt"));
 
 	if (ps.nr) {
-		int i;
 		char *ps_matched = xcalloc(ps.nr, 1);
 
 		/* TODO: audit for interaction with sparse-index. */
@@ -3249,7 +3237,7 @@ static void die_on_index_match(const char *path, int force)
 		 * Since there is only one pathspec, we just need to
 		 * check ps_matched[0] to know if a cache entry matched.
 		 */
-		for (i = 0; i < the_index.cache_nr; i++) {
+		for (int i = 0; i < the_index.cache_nr; i++) {
 			ce_path_match(&the_index, the_index.cache[i], &ps,
 				      ps_matched);
 
diff --git a/builtin/tag.c b/builtin/tag.c
index 37473ac21f..2e2b315183 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -78,12 +78,11 @@ typedef int (*each_tag_name_fn)(const char *name, const char *ref,
 static int for_each_tag_name(const char **argv, each_tag_name_fn fn,
 			     void *cb_data)
 {
-	const char **p;
 	struct strbuf ref = STRBUF_INIT;
 	int had_error = 0;
 	struct object_id oid;
 
-	for (p = argv; *p; p++) {
+	for (const char **p = argv; *p; p++) {
 		strbuf_reset(&ref);
 		strbuf_addf(&ref, "refs/tags/%s", *p);
 		if (read_ref(ref.buf, &oid)) {
diff --git a/builtin/unpack-objects.c b/builtin/unpack-objects.c
index e0a701f2b3..0801d13b0e 100644
--- a/builtin/unpack-objects.c
+++ b/builtin/unpack-objects.c
@@ -248,8 +248,7 @@ static int check_object(struct object *obj, enum object_type type,
 
 static void write_rest(void)
 {
-	unsigned i;
-	for (i = 0; i < nr_objects; i++) {
+	for (unsigned i = 0; i < nr_objects; i++) {
 		if (obj_list[i].obj)
 			check_object(obj_list[i].obj, OBJ_ANY, NULL, NULL);
 	}
@@ -574,7 +573,6 @@ static void unpack_one(unsigned nr)
 
 static void unpack_all(void)
 {
-	int i;
 	struct pack_header *hdr = fill(sizeof(struct pack_header));
 
 	nr_objects = ntohl(hdr->hdr_entries);
@@ -590,7 +588,7 @@ static void unpack_all(void)
 		progress = start_progress(_("Unpacking objects"), nr_objects);
 	CALLOC_ARRAY(obj_list, nr_objects);
 	begin_odb_transaction();
-	for (i = 0; i < nr_objects; i++) {
+	for (int i = 0; i < nr_objects; i++) {
 		unpack_one(i);
 		display_progress(progress, i + 1);
 	}
@@ -603,7 +601,6 @@ static void unpack_all(void)
 
 int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
 {
-	int i;
 	struct object_id oid;
 	git_hash_ctx tmp_ctx;
 
@@ -613,7 +610,7 @@ int cmd_unpack_objects(int argc, const char **argv, const char *prefix UNUSED)
 
 	quiet = !isatty(2);
 
-	for (i = 1 ; i < argc; i++) {
+	for (int i = 1; i < argc; i++) {
 		const char *arg = argv[i];
 
 		if (*arg == '-') {
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 7bcaa1476c..60e346960e 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -655,10 +655,9 @@ static int unresolve_one(const char *path)
 static int do_unresolve(int ac, const char **av,
 			const char *prefix, int prefix_length)
 {
-	int i;
 	int err = 0;
 
-	for (i = 1; i < ac; i++) {
+	for (int i = 1; i < ac; i++) {
 		const char *arg = av[i];
 		char *p = prefix_path(prefix, prefix_length, arg);
 		err |= unresolve_one(p);
@@ -670,10 +669,6 @@ static int do_unresolve(int ac, const char **av,
 static int do_reupdate(const char **paths,
 		       const char *prefix)
 {
-	/* Read HEAD and run update-index on paths that are
-	 * merged and already different between index and HEAD.
-	 */
-	int pos;
 	int has_head = 1;
 	struct pathspec pathspec;
 	struct object_id head_oid;
@@ -688,7 +683,7 @@ static int do_reupdate(const char **paths,
 		 */
 		has_head = 0;
  redo:
-	for (pos = 0; pos < the_index.cache_nr; pos++) {
+	for (int pos = 0; pos < the_index.cache_nr; pos++) {
 		const struct cache_entry *ce = the_index.cache[pos];
 		struct cache_entry *old = NULL;
 		int save_nr;
diff --git a/builtin/var.c b/builtin/var.c
index cf5567208a..3aa4e4d45b 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -168,10 +168,9 @@ static struct git_var git_vars[] = {
 
 static void list_vars(void)
 {
-	struct git_var *ptr;
 	char *val;
 
-	for (ptr = git_vars; ptr->read; ptr++)
+	for (struct git_var *ptr = git_vars; ptr->read; ptr++)
 		if ((val = ptr->read(0))) {
 			if (ptr->multivalued && *val) {
 				struct string_list list = STRING_LIST_INIT_DUP;
@@ -190,8 +189,7 @@ static void list_vars(void)
 
 static const struct git_var *get_git_var(const char *var)
 {
-	struct git_var *ptr;
-	for (ptr = git_vars; ptr->read; ptr++) {
+	for (struct git_var *ptr = git_vars; ptr->read; ptr++) {
 		if (strcmp(var, ptr->name) == 0) {
 			return ptr;
 		}
diff --git a/builtin/verify-pack.c b/builtin/verify-pack.c
index 011dddd2dc..a342d5adf3 100644
--- a/builtin/verify-pack.c
+++ b/builtin/verify-pack.c
@@ -66,7 +66,6 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix)
 	int err = 0;
 	unsigned int flags = 0;
 	const char *object_format = NULL;
-	int i;
 	const struct option verify_pack_options[] = {
 		OPT_BIT('v', "verbose", &flags, N_("verbose"),
 			VERIFY_PACK_VERBOSE),
@@ -82,7 +81,7 @@ int cmd_verify_pack(int argc, const char **argv, const char *prefix)
 			     verify_pack_usage, 0);
 	if (argc < 1)
 		usage_with_options(verify_pack_usage, verify_pack_options);
-	for (i = 0; i < argc; i++) {
+	for (int i = 0; i < argc; i++) {
 		if (verify_one_pack(argv[i], flags, object_format))
 			err = 1;
 	}
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 9c76b62b02..d4c5b6b7d3 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -191,10 +191,8 @@ static int prune_cmp(const void *a, const void *b)
 
 static void prune_dups(struct string_list *l)
 {
-	int i;
-
 	QSORT(l->items, l->nr, prune_cmp);
-	for (i = 1; i < l->nr; i++) {
+	for (int i = 1; i < l->nr; i++) {
 		if (!fspathcmp(l->items[i].string, l->items[i - 1].string))
 			prune_worktree(l->items[i].util, "duplicate entry");
 	}
@@ -999,9 +997,7 @@ static void show_worktree(struct worktree *wt, int path_maxlen, int abbrev_len)
 
 static void measure_widths(struct worktree **wt, int *abbrev, int *maxlen)
 {
-	int i;
-
-	for (i = 0; wt[i]; i++) {
+	for (int i = 0; wt[i]; i++) {
 		int sha1_len;
 		int path_len = strlen(wt[i]->path);
 
@@ -1055,7 +1051,7 @@ static int list(int ac, const char **av, const char *prefix)
 		die(_("the option '%s' requires '%s'"), "-z", "--porcelain");
 	else {
 		struct worktree **worktrees = get_worktrees();
-		int path_maxlen = 0, abbrev = DEFAULT_ABBREV, i;
+		int path_maxlen = 0, abbrev = DEFAULT_ABBREV;
 
 		/* sort worktrees by path but keep main worktree at top */
 		pathsort(worktrees + 1);
@@ -1063,7 +1059,7 @@ static int list(int ac, const char **av, const char *prefix)
 		if (!porcelain)
 			measure_widths(worktrees, &abbrev, &path_maxlen);
 
-		for (i = 0; worktrees[i]; i++) {
+		for (int i = 0; worktrees[i]; i++) {
 			if (porcelain)
 				show_worktree_porcelain(worktrees[i],
 							line_terminator);
diff --git a/bulk-checkin.c b/bulk-checkin.c
index eb46b88637..c00c4ad3a7 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -51,7 +51,6 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state)
 {
 	unsigned char hash[GIT_MAX_RAWSZ];
 	struct strbuf packname = STRBUF_INIT;
-	int i;
 
 	if (!state->f)
 		return;
@@ -76,7 +75,7 @@ static void flush_bulk_checkin_packfile(struct bulk_checkin_packfile *state)
 	finish_tmp_packfile(&packname, state->pack_tmp_name,
 			    state->written, state->nr_written,
 			    &state->pack_idx_opts, hash);
-	for (i = 0; i < state->nr_written; i++)
+	for (int i = 0; i < state->nr_written; i++)
 		free(state->written[i]);
 
 clear_exit:
@@ -124,14 +123,12 @@ static void flush_batch_fsync(void)
 
 static int already_written(struct bulk_checkin_packfile *state, struct object_id *oid)
 {
-	int i;
-
 	/* The object may already exist in the repository */
 	if (repo_has_object_file(the_repository, oid))
 		return 1;
 
 	/* Might want to keep the list sorted */
-	for (i = 0; i < state->nr_written; i++)
+	for (int i = 0; i < state->nr_written; i++)
 		if (oideq(&state->written[i]->oid, oid))
 			return 1;
 
diff --git a/bundle-uri.c b/bundle-uri.c
index ca32050a78..45d615a3db 100644
--- a/bundle-uri.c
+++ b/bundle-uri.c
@@ -114,8 +114,7 @@ void print_bundle_list(FILE *fp, struct bundle_list *list)
 	fprintf(fp, "\tmode = %s\n", mode);
 
 	if (list->heuristic) {
-		int i;
-		for (i = 0; i < BUNDLE_HEURISTIC__COUNT; i++) {
+		for (int i = 0; i < BUNDLE_HEURISTIC__COUNT; i++) {
 			if (heuristics[i].heuristic == list->heuristic) {
 				printf("\theuristic = %s\n",
 				       heuristics[list->heuristic].name);
@@ -167,8 +166,7 @@ static int bundle_list_update(const char *key, const char *value,
 		}
 
 		if (!strcmp(subkey, "heuristic")) {
-			int i;
-			for (i = 0; i < BUNDLE_HEURISTIC__COUNT; i++) {
+			for (int i = 0; i < BUNDLE_HEURISTIC__COUNT; i++) {
 				if (heuristics[i].heuristic &&
 				    heuristics[i].name &&
 				    !strcmp(value, heuristics[i].name)) {
diff --git a/bundle.c b/bundle.c
index a9744da255..419ba4cc45 100644
--- a/bundle.c
+++ b/bundle.c
@@ -60,9 +60,7 @@ static int parse_capability(struct bundle_header *header, const char *capability
 
 static int parse_bundle_signature(struct bundle_header *header, const char *line)
 {
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(bundle_sigs); i++) {
+	for (int i = 0; i < ARRAY_SIZE(bundle_sigs); i++) {
 		if (!strcmp(line, bundle_sigs[i].signature)) {
 			header->version = bundle_sigs[i].version;
 			return 0;
@@ -167,9 +165,7 @@ int is_bundle(const char *path, int quiet)
 
 static int list_refs(struct string_list *r, int argc, const char **argv)
 {
-	int i;
-
-	for (i = 0; i < r->nr; i++) {
+	for (int i = 0; i < r->nr; i++) {
 		struct object_id *oid;
 		const char *name;
 
@@ -216,7 +212,7 @@ int verify_bundle(struct repository *r,
 	 * to be verbose about the errors
 	 */
 	struct string_list *p = &header->prerequisites;
-	int i, ret = 0;
+	int ret = 0;
 	const char *message = _("Repository lacks these prerequisite commits:");
 	struct string_list_iterator iter = {
 		.list = p,
@@ -228,7 +224,7 @@ int verify_bundle(struct repository *r,
 	if (!r || !r->objects || !r->objects->odb)
 		return error(_("need a repository to verify a bundle"));
 
-	for (i = 0; i < p->nr; i++) {
+	for (int i = 0; i < p->nr; i++) {
 		struct string_list_item *e = p->items + i;
 		const char *name = e->string;
 		struct object_id *oid = e->util;
@@ -320,7 +316,6 @@ static int is_tag_in_date_range(struct object *tag, struct rev_info *revs)
 static int write_pack_data(int bundle_fd, struct rev_info *revs, struct strvec *pack_options)
 {
 	struct child_process pack_objects = CHILD_PROCESS_INIT;
-	int i;
 
 	strvec_pushl(&pack_objects.args,
 		     "pack-objects",
@@ -350,7 +345,7 @@ static int write_pack_data(int bundle_fd, struct rev_info *revs, struct strvec *
 	if (start_command(&pack_objects))
 		return error(_("Could not spawn pack-objects"));
 
-	for (i = 0; i < revs->pending.nr; i++) {
+	for (int i = 0; i < revs->pending.nr; i++) {
 		struct object *object = revs->pending.objects[i].item;
 		if (object->flags & UNINTERESTING)
 			write_or_die(pack_objects.in, "^", 1);
@@ -374,10 +369,9 @@ static int write_pack_data(int bundle_fd, struct rev_info *revs, struct strvec *
  */
 static int write_bundle_refs(int bundle_fd, struct rev_info *revs)
 {
-	int i;
 	int ref_count = 0;
 
-	for (i = 0; i < revs->pending.nr; i++) {
+	for (int i = 0; i < revs->pending.nr; i++) {
 		struct object_array_entry *e = revs->pending.objects + i;
 		struct object_id oid;
 		char *ref;
@@ -500,7 +494,6 @@ int create_bundle(struct repository *r, const char *path,
 	struct rev_info revs, revs_copy;
 	int min_version = 2;
 	struct bundle_prerequisites_info bpi;
-	int i;
 
 	/* init revs to list objects for pack-objects later */
 	save_commit_buffer = 0;
@@ -566,7 +559,7 @@ int create_bundle(struct repository *r, const char *path,
 	revs_copy.pending.nr = 0;
 	revs_copy.pending.alloc = 0;
 	revs_copy.pending.objects = NULL;
-	for (i = 0; i < revs.pending.nr; i++) {
+	for (int i = 0; i < revs.pending.nr; i++) {
 		struct object_array_entry *e = revs.pending.objects + i;
 		if (e)
 			add_object_array_with_path(e->item, e->name,
diff --git a/cache-tree.c b/cache-tree.c
index 64678fe199..1aa30bdd80 100644
--- a/cache-tree.c
+++ b/cache-tree.c
@@ -27,12 +27,11 @@ struct cache_tree *cache_tree(void)
 
 void cache_tree_free(struct cache_tree **it_p)
 {
-	int i;
 	struct cache_tree *it = *it_p;
 
 	if (!it)
 		return;
-	for (i = 0; i < it->subtree_nr; i++)
+	for (int i = 0; i < it->subtree_nr; i++)
 		if (it->down[i]) {
 			cache_tree_free(&it->down[i]->cache_tree);
 			free(it->down[i]);
@@ -216,8 +215,8 @@ static void discard_unused_subtrees(struct cache_tree *it)
 {
 	struct cache_tree_sub **down = it->down;
 	int nr = it->subtree_nr;
-	int dst, src;
-	for (dst = src = 0; src < nr; src++) {
+	int src;
+	for (int dst = src = 0; src < nr; src++) {
 		struct cache_tree_sub *s = down[src];
 		if (s->used)
 			down[dst++] = s;
@@ -231,12 +230,11 @@ static void discard_unused_subtrees(struct cache_tree *it)
 
 int cache_tree_fully_valid(struct cache_tree *it)
 {
-	int i;
 	if (!it)
 		return 0;
 	if (it->entry_count < 0 || !repo_has_object_file(the_repository, &it->oid))
 		return 0;
-	for (i = 0; i < it->subtree_nr; i++) {
+	for (int i = 0; i < it->subtree_nr; i++) {
 		if (!cache_tree_fully_valid(it->down[i]->cache_tree))
 			return 0;
 	}
@@ -495,8 +493,6 @@ int cache_tree_update(struct index_state *istate, int flags)
 static void write_one(struct strbuf *buffer, struct cache_tree *it,
 		      const char *path, int pathlen)
 {
-	int i;
-
 	/* One "cache-tree" entry consists of the following:
 	 * path (NUL terminated)
 	 * entry_count, subtree_nr ("%d %d\n")
@@ -520,7 +516,7 @@ static void write_one(struct strbuf *buffer, struct cache_tree *it,
 	if (0 <= it->entry_count) {
 		strbuf_add(buffer, it->oid.hash, the_hash_algo->rawsz);
 	}
-	for (i = 0; i < it->subtree_nr; i++) {
+	for (int i = 0; i < it->subtree_nr; i++) {
 		struct cache_tree_sub *down = it->down[i];
 		if (i) {
 			struct cache_tree_sub *prev = it->down[i-1];
@@ -546,7 +542,7 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
 	const char *cp;
 	char *ep;
 	struct cache_tree *it;
-	int i, subtree_nr;
+	int subtree_nr;
 	const unsigned rawsz = the_hash_algo->rawsz;
 
 	it = NULL;
@@ -600,7 +596,7 @@ static struct cache_tree *read_one(const char **buffer, unsigned long *size_p)
 	 */
 	it->subtree_alloc = subtree_nr + 2;
 	CALLOC_ARRAY(it->down, it->subtree_alloc);
-	for (i = 0; i < subtree_nr; i++) {
+	for (int i = 0; i < subtree_nr; i++) {
 		/* read each subtree */
 		struct cache_tree *sub;
 		struct cache_tree_sub *subtree;
@@ -699,9 +695,8 @@ struct tree* write_in_core_index_as_tree(struct repository *repo) {
 
 	ret = write_index_as_tree_internal(&o, index_state, was_valid, 0, NULL);
 	if (ret == WRITE_TREE_UNMERGED_INDEX) {
-		int i;
 		bug("there are unmerged index entries:");
-		for (i = 0; i < index_state->cache_nr; i++) {
+		for (int i = 0; i < index_state->cache_nr; i++) {
 			const struct cache_entry *ce = index_state->cache[i];
 			if (ce_stage(ce))
 				bug("%d %.*s", ce_stage(ce),
diff --git a/chunk-format.c b/chunk-format.c
index cdc7f39b70..6ecf1b5326 100644
--- a/chunk-format.c
+++ b/chunk-format.c
@@ -189,9 +189,7 @@ int read_chunk(struct chunkfile *cf,
 	       chunk_read_fn fn,
 	       void *data)
 {
-	int i;
-
-	for (i = 0; i < cf->chunks_nr; i++) {
+	for (int i = 0; i < cf->chunks_nr; i++) {
 		if (cf->chunks[i].id == chunk_id)
 			return fn(cf->chunks[i].start, cf->chunks[i].size, data);
 	}
diff --git a/color.c b/color.c
index f663c06ac4..26a6ecdaff 100644
--- a/color.c
+++ b/color.c
@@ -85,7 +85,6 @@ static int parse_ansi_color(struct color *out, const char *name, int len)
 		"black", "red", "green", "yellow",
 		"blue", "magenta", "cyan", "white"
 	};
-	int i;
 	int color_offset = COLOR_FOREGROUND_ANSI;
 
 	if (match_word(name, len, "default")) {
@@ -114,7 +113,7 @@ static int parse_ansi_color(struct color *out, const char *name, int len)
 		name += 6;
 		len -= 6;
 	}
-	for (i = 0; i < ARRAY_SIZE(color_names); i++) {
+	for (int i = 0; i < ARRAY_SIZE(color_names); i++) {
 		if (match_word(name, len, color_names[i])) {
 			out->type = COLOR_ANSI;
 			out->value = i + color_offset;
@@ -200,14 +199,13 @@ static int parse_attr(const char *name, size_t len)
 #undef ATTR
 	};
 	int negate = 0;
-	int i;
 
 	if (skip_prefix_mem(name, len, "no", &name, &len)) {
 		skip_prefix_mem(name, len, "-", &name, &len);
 		negate = 1;
 	}
 
-	for (i = 0; i < ARRAY_SIZE(attrs); i++) {
+	for (int i = 0; i < ARRAY_SIZE(attrs); i++) {
 		if (attrs[i].len == len && !memcmp(attrs[i].name, name, len))
 			return negate ? attrs[i].neg : attrs[i].val;
 	}
@@ -324,7 +322,6 @@ int color_parse_mem(const char *value, int value_len, char *dst)
 
 	if (has_reset || attr || !color_empty(&fg) || !color_empty(&bg)) {
 		int sep = 0;
-		int i;
 
 		OUT('\033');
 		OUT('[');
@@ -332,7 +329,7 @@ int color_parse_mem(const char *value, int value_len, char *dst)
 		if (has_reset)
 			sep++;
 
-		for (i = 0; attr; i++) {
+		for (int i = 0; attr; i++) {
 			unsigned bit = (1 << i);
 			if (!(attr & bit))
 				continue;
diff --git a/column.c b/column.c
index 50bbccc92e..a2c0dae297 100644
--- a/column.c
+++ b/column.c
@@ -33,10 +33,8 @@ static int item_length(const char *s)
  */
 static void layout(struct column_data *data, int *width)
 {
-	int i;
-
 	*width = 0;
-	for (i = 0; i < data->list->nr; i++)
+	for (int i = 0; i < data->list->nr; i++)
 		if (*width < data->len[i])
 			*width = data->len[i];
 
@@ -51,8 +49,8 @@ static void layout(struct column_data *data, int *width)
 
 static void compute_column_width(struct column_data *data)
 {
-	int i, x, y;
-	for (x = 0; x < data->cols; x++) {
+	int i, y;
+	for (int x = 0; x < data->cols; x++) {
 		data->width[x] = XY2LINEAR(data, x, 0);
 		for (y = 0; y < data->rows; y++) {
 			i = XY2LINEAR(data, x, y);
@@ -102,9 +100,7 @@ static void shrink_columns(struct column_data *data)
 static void display_plain(const struct string_list *list,
 			  const char *indent, const char *nl)
 {
-	int i;
-
-	for (i = 0; i < list->nr; i++)
+	for (int i = 0; i < list->nr; i++)
 		printf("%s%s%s", indent, list->items[i].string, nl);
 }
 
@@ -147,7 +143,7 @@ static void display_table(const struct string_list *list,
 			  const struct column_options *opts)
 {
 	struct column_data data;
-	int x, y, i, initial_width;
+	int x, initial_width;
 	char *empty_cell;
 
 	memset(&data, 0, sizeof(data));
@@ -156,7 +152,7 @@ static void display_table(const struct string_list *list,
 	data.opts = *opts;
 
 	ALLOC_ARRAY(data.len, list->nr);
-	for (i = 0; i < list->nr; i++)
+	for (int i = 0; i < list->nr; i++)
 		data.len[i] = item_length(list->items[i].string);
 
 	layout(&data, &initial_width);
@@ -166,7 +162,7 @@ static void display_table(const struct string_list *list,
 
 	empty_cell = xmallocz(initial_width);
 	memset(empty_cell, ' ', initial_width);
-	for (y = 0; y < data.rows; y++) {
+	for (int y = 0; y < data.rows; y++) {
 		for (x = 0; x < data.cols; x++)
 			if (display_cell(&data, initial_width, empty_cell, x, y))
 				break;
@@ -243,9 +239,7 @@ static int parse_option(const char *arg, int len, unsigned int *colopts,
 		{ "row",    COL_ROW,      COL_LAYOUT_MASK },
 		{ "dense",  COL_DENSE,    0 },
 	};
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(opts); i++) {
+	for (int i = 0; i < ARRAY_SIZE(opts); i++) {
 		int set = 1, arg_len = len, name_len;
 		const char *arg_str = arg;
 
diff --git a/combine-diff.c b/combine-diff.c
index d6d6fa1689..a1d58f9029 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -891,11 +891,11 @@ static void reuse_combine_diff(struct sline *sline, unsigned long cnt,
 	 * and parent j are the same, so reuse the combined result
 	 * of parent j for parent i.
 	 */
-	unsigned long lno, imask, jmask;
+	unsigned long imask, jmask;
 	imask = (1UL<<i);
 	jmask = (1UL<<j);
 
-	for (lno = 0; lno <= cnt; lno++) {
+	for (unsigned long lno = 0; lno <= cnt; lno++) {
 		struct lline *ll = sline->lost;
 		sline->p_lno[i] = sline->p_lno[j];
 		while (ll) {
@@ -1321,7 +1321,6 @@ static void free_combined_pair(struct diff_filepair *pair)
 static struct diff_filepair *combined_pair(struct combine_diff_path *p,
 					   int num_parent)
 {
-	int i;
 	struct diff_filepair *pair;
 	struct diff_filespec *pool;
 
@@ -1330,7 +1329,7 @@ static struct diff_filepair *combined_pair(struct combine_diff_path *p,
 	pair->one = pool + 1;
 	pair->two = pool;
 
-	for (i = 0; i < num_parent; i++) {
+	for (int i = 0; i < num_parent; i++) {
 		pair->one[i].path = p->path;
 		pair->one[i].mode = p->parent[i].mode;
 		oidcpy(&pair->one[i].oid, &p->parent[i].oid);
@@ -1389,7 +1388,7 @@ static struct combine_diff_path *find_paths_generic(const struct object_id *oid,
 	int combined_all_paths)
 {
 	struct combine_diff_path *paths = NULL;
-	int i, num_parent = parents->nr;
+	int num_parent = parents->nr;
 
 	int output_format = opt->output_format;
 	const char *orderfile = opt->orderfile;
@@ -1399,7 +1398,7 @@ static struct combine_diff_path *find_paths_generic(const struct object_id *oid,
 	opt->orderfile = NULL;
 
 	/* D(A,P1...Pn) = D(A,P1) ^ ... ^ D(A,Pn)  (wrt paths) */
-	for (i = 0; i < num_parent; i++) {
+	for (int i = 0; i < num_parent; i++) {
 		/*
 		 * show stat against the first parent even when doing
 		 * combined diff.
@@ -1437,13 +1436,13 @@ static struct combine_diff_path *find_paths_multitree(
 	const struct object_id *oid, const struct oid_array *parents,
 	struct diff_options *opt)
 {
-	int i, nparent = parents->nr;
+	int nparent = parents->nr;
 	const struct object_id **parents_oid;
 	struct combine_diff_path paths_head;
 	struct strbuf base;
 
 	ALLOC_ARRAY(parents_oid, nparent);
-	for (i = 0; i < nparent; i++)
+	for (int i = 0; i < nparent; i++)
 		parents_oid[i] = &parents->oid[i];
 
 	/* fake list head, so worker can assume it is non-NULL */
@@ -1461,10 +1460,9 @@ static int match_objfind(struct combine_diff_path *path,
 			 int num_parent,
 			 const struct oidset *set)
 {
-	int i;
 	if (oidset_contains(set, &path->oid))
 		return 1;
-	for (i = 0; i < num_parent; i++) {
+	for (int i = 0; i < num_parent; i++) {
 		if (oidset_contains(set, &path->parent[i].oid))
 			return 1;
 	}
diff --git a/commit-graph.c b/commit-graph.c
index 45417d7412..ab4b8d5300 100644
--- a/commit-graph.c
+++ b/commit-graph.c
@@ -139,7 +139,7 @@ static timestamp_t commit_graph_generation_from_graph(const struct commit *c)
 
 static struct commit_graph_data *commit_graph_data_at(const struct commit *c)
 {
-	unsigned int i, nth_slab;
+	unsigned int nth_slab;
 	struct commit_graph_data *data =
 		commit_graph_data_slab_peek(&commit_graph_data_slab, c);
 
@@ -156,7 +156,7 @@ static struct commit_graph_data *commit_graph_data_at(const struct commit *c)
 	 * We avoid initializing generation with checking if graph position
 	 * is not COMMIT_NOT_FROM_GRAPH.
 	 */
-	for (i = 0; i < commit_graph_data_slab.slab_size; i++) {
+	for (unsigned int i = 0; i < commit_graph_data_slab.slab_size; i++) {
 		commit_graph_data_slab.slab[nth_slab][i].graph_pos =
 			COMMIT_NOT_FROM_GRAPH;
 	}
@@ -278,14 +278,13 @@ static int graph_read_oid_fanout(const unsigned char *chunk_start,
 				 size_t chunk_size, void *data)
 {
 	struct commit_graph *g = data;
-	int i;
 
 	if (chunk_size != 256 * sizeof(uint32_t))
 		return error(_("commit-graph oid fanout chunk is wrong size"));
 	g->chunk_oid_fanout = (const uint32_t *)chunk_start;
 	g->num_commits = ntohl(g->chunk_oid_fanout[255]);
 
-	for (i = 0; i < 255; i++) {
+	for (int i = 0; i < 255; i++) {
 		uint32_t oid_fanout1 = ntohl(g->chunk_oid_fanout[i]);
 		uint32_t oid_fanout2 = ntohl(g->chunk_oid_fanout[i + 1]);
 
@@ -722,8 +721,6 @@ static void prepare_commit_graph_one(struct repository *r,
  */
 static int prepare_commit_graph(struct repository *r)
 {
-	struct object_directory *odb;
-
 	/*
 	 * Early return if there is no git dir or if the commit graph is
 	 * disabled.
@@ -754,9 +751,7 @@ static int prepare_commit_graph(struct repository *r)
 		return 0;
 
 	prepare_alt_odb(r);
-	for (odb = r->objects->odb;
-	     !r->objects->commit_graph && odb;
-	     odb = odb->next)
+	for (struct object_directory *odb = r->objects->odb; !r->objects->commit_graph && odb; odb = odb->next)
 		prepare_commit_graph_one(r, odb);
 	return !!r->objects->commit_graph;
 }
@@ -1153,7 +1148,7 @@ static int write_graph_chunk_fanout(struct hashfile *f,
 				    void *data)
 {
 	struct write_commit_graph_context *ctx = data;
-	int i, count = 0;
+	int count = 0;
 	struct commit **list = ctx->commits.list;
 
 	/*
@@ -1161,7 +1156,7 @@ static int write_graph_chunk_fanout(struct hashfile *f,
 	 * but we use a 256-entry lookup to be able to avoid
 	 * having to do eight extra binary search iterations).
 	 */
-	for (i = 0; i < 256; i++) {
+	for (int i = 0; i < 256; i++) {
 		while (count < ctx->commits.nr) {
 			if ((*list)->object.oid.hash[0] != i)
 				break;
@@ -1181,8 +1176,7 @@ static int write_graph_chunk_oids(struct hashfile *f,
 {
 	struct write_commit_graph_context *ctx = data;
 	struct commit **list = ctx->commits.list;
-	int count;
-	for (count = 0; count < ctx->commits.nr; count++, list++) {
+	for (int count = 0; count < ctx->commits.nr; count++, list++) {
 		display_progress(ctx->progress, ++ctx->progress_cnt);
 		hashwrite(f, (*list)->object.oid.hash, the_hash_algo->rawsz);
 	}
@@ -1303,9 +1297,9 @@ static int write_graph_chunk_generation_data(struct hashfile *f,
 					     void *data)
 {
 	struct write_commit_graph_context *ctx = data;
-	int i, num_generation_data_overflows = 0;
+	int num_generation_data_overflows = 0;
 
-	for (i = 0; i < ctx->commits.nr; i++) {
+	for (int i = 0; i < ctx->commits.nr; i++) {
 		struct commit *c = ctx->commits.list[i];
 		timestamp_t offset;
 		repo_parse_commit(ctx->r, c);
@@ -1327,8 +1321,7 @@ static int write_graph_chunk_generation_data_overflow(struct hashfile *f,
 						      void *data)
 {
 	struct write_commit_graph_context *ctx = data;
-	int i;
-	for (i = 0; i < ctx->commits.nr; i++) {
+	for (int i = 0; i < ctx->commits.nr; i++) {
 		struct commit *c = ctx->commits.list[i];
 		timestamp_t offset = commit_graph_data_at(c)->generation - c->date;
 		display_progress(ctx->progress, ++ctx->progress_cnt);
@@ -1487,8 +1480,7 @@ static int add_packed_commits(const struct object_id *oid,
 
 static void add_missing_parents(struct write_commit_graph_context *ctx, struct commit *commit)
 {
-	struct commit_list *parent;
-	for (parent = commit->parents; parent; parent = parent->next) {
+	for (struct commit_list *parent = commit->parents; parent; parent = parent->next) {
 		if (!(parent->item->object.flags & REACHABLE)) {
 			oid_array_append(&ctx->oids, &parent->item->object.oid);
 			parent->item->object.flags |= REACHABLE;
@@ -1589,10 +1581,9 @@ static void compute_reachable_generation_numbers(
 			struct compute_generation_info *info,
 			int generation_version)
 {
-	int i;
 	struct commit_list *list = NULL;
 
-	for (i = 0; i < info->commits->nr; i++) {
+	for (int i = 0; i < info->commits->nr; i++) {
 		struct commit *c = info->commits->list[i];
 		timestamp_t gen;
 		repo_parse_commit(info->r, c);
@@ -1758,7 +1749,6 @@ static void trace2_bloom_filter_write_statistics(struct write_commit_graph_conte
 
 static void compute_bloom_filters(struct write_commit_graph_context *ctx)
 {
-	int i;
 	struct progress *progress = NULL;
 	struct commit **sorted_commits;
 	int max_new_filters;
@@ -1780,7 +1770,7 @@ static void compute_bloom_filters(struct write_commit_graph_context *ctx)
 	max_new_filters = ctx->opts && ctx->opts->max_new_filters >= 0 ?
 		ctx->opts->max_new_filters : ctx->commits.nr;
 
-	for (i = 0; i < ctx->commits.nr; i++) {
+	for (int i = 0; i < ctx->commits.nr; i++) {
 		enum bloom_filter_computed computed = 0;
 		struct commit *c = sorted_commits[i];
 		struct bloom_filter *filter = get_or_compute_bloom_filter(
@@ -1859,7 +1849,6 @@ int write_commit_graph_reachable(struct object_directory *odb,
 static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
 				const struct string_list *pack_indexes)
 {
-	uint32_t i;
 	struct strbuf progress_title = STRBUF_INIT;
 	struct strbuf packname = STRBUF_INIT;
 	int dirlen;
@@ -1876,7 +1865,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
 		ctx->progress = start_delayed_progress(progress_title.buf, 0);
 		ctx->progress_done = 0;
 	}
-	for (i = 0; i < pack_indexes->nr; i++) {
+	for (uint32_t i = 0; i < pack_indexes->nr; i++) {
 		struct packed_git *p;
 		strbuf_setlen(&packname, dirlen);
 		strbuf_addstr(&packname, pack_indexes->items[i].string);
@@ -1935,7 +1924,6 @@ static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
 
 static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
 {
-	uint32_t i;
 	enum commit_graph_split_flags flags = ctx->opts ?
 		ctx->opts->split_flags : COMMIT_GRAPH_SPLIT_UNSPECIFIED;
 
@@ -1945,7 +1933,7 @@ static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
 			_("Finding extra edges in commit graph"),
 			ctx->oids.nr);
 	oid_array_sort(&ctx->oids);
-	for (i = 0; i < ctx->oids.nr; i = oid_array_next_unique(&ctx->oids, i)) {
+	for (uint32_t i = 0; i < ctx->oids.nr; i = oid_array_next_unique(&ctx->oids, i)) {
 		unsigned int num_parents;
 
 		display_progress(ctx->progress, i + 1);
@@ -2276,7 +2264,6 @@ static void split_graph_merge_strategy(struct write_commit_graph_context *ctx)
 static void merge_commit_graph(struct write_commit_graph_context *ctx,
 			       struct commit_graph *g)
 {
-	uint32_t i;
 	uint32_t offset = g->num_commits_in_base;
 
 	if (unsigned_add_overflows(ctx->commits.nr, g->num_commits))
@@ -2286,7 +2273,7 @@ static void merge_commit_graph(struct write_commit_graph_context *ctx,
 
 	ALLOC_GROW(ctx->commits.list, ctx->commits.nr + g->num_commits, ctx->commits.alloc);
 
-	for (i = 0; i < g->num_commits; i++) {
+	for (uint32_t i = 0; i < g->num_commits; i++) {
 		struct object_id oid;
 		struct commit *result;
 
@@ -2313,7 +2300,7 @@ static int commit_compare(const void *_a, const void *_b)
 
 static void sort_and_scan_merged_commits(struct write_commit_graph_context *ctx)
 {
-	uint32_t i, dedup_i = 0;
+	uint32_t dedup_i = 0;
 
 	if (ctx->report_progress)
 		ctx->progress = start_delayed_progress(
@@ -2323,7 +2310,7 @@ static void sort_and_scan_merged_commits(struct write_commit_graph_context *ctx)
 	QSORT(ctx->commits.list, ctx->commits.nr, commit_compare);
 
 	ctx->num_extra_edges = 0;
-	for (i = 0; i < ctx->commits.nr; i++) {
+	for (uint32_t i = 0; i < ctx->commits.nr; i++) {
 		display_progress(ctx->progress, i + 1);
 
 		if (i && oideq(&ctx->commits.list[i - 1]->object.oid,
@@ -2382,10 +2369,9 @@ static void merge_commit_graphs(struct write_commit_graph_context *ctx)
 
 static void mark_commit_graphs(struct write_commit_graph_context *ctx)
 {
-	uint32_t i;
 	time_t now = time(NULL);
 
-	for (i = ctx->num_commit_graphs_after - 1; i < ctx->num_commit_graphs_before; i++) {
+	for (uint32_t i = ctx->num_commit_graphs_after - 1; i < ctx->num_commit_graphs_before; i++) {
 		struct stat st;
 		struct utimbuf updated_time;
 
diff --git a/commit-reach.c b/commit-reach.c
index ecc913fc99..a0a853abf8 100644
--- a/commit-reach.c
+++ b/commit-reach.c
@@ -39,8 +39,7 @@ static int compare_commits_by_gen(const void *_a, const void *_b)
 
 static int queue_has_nonstale(struct prio_queue *queue)
 {
-	int i;
-	for (i = 0; i < queue->nr; i++) {
+	for (int i = 0; i < queue->nr; i++) {
 		struct commit *commit = queue->array[i].data;
 		if (!(commit->object.flags & STALE))
 			return 1;
@@ -56,7 +55,6 @@ static struct commit_list *paint_down_to_common(struct repository *r,
 {
 	struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
 	struct commit_list *result = NULL;
-	int i;
 	timestamp_t last_gen = GENERATION_NUMBER_INFINITY;
 
 	if (!min_generation && !corrected_commit_dates_enabled(r))
@@ -69,7 +67,7 @@ static struct commit_list *paint_down_to_common(struct repository *r,
 	}
 	prio_queue_put(&queue, one);
 
-	for (i = 0; i < n; i++) {
+	for (int i = 0; i < n; i++) {
 		twos[i]->object.flags |= PARENT2;
 		prio_queue_put(&queue, twos[i]);
 	}
@@ -151,14 +149,14 @@ static struct commit_list *merge_bases_many(struct repository *r,
 
 struct commit_list *get_octopus_merge_bases(struct commit_list *in)
 {
-	struct commit_list *i, *j, *k, *ret = NULL;
+	struct commit_list *j, *k, *ret = NULL;
 
 	if (!in)
 		return ret;
 
 	commit_list_insert(in->item, &ret);
 
-	for (i = in->next; i; i = i->next) {
+	for (struct commit_list *i = in->next; i; i = i->next) {
 		struct commit_list *new_commits = NULL, *end = NULL;
 
 		for (j = ret; j; j = j->next) {
@@ -360,13 +358,7 @@ static int remove_redundant(struct repository *r, struct commit **array, int cnt
 	 * that number.
 	 */
 	if (generation_numbers_enabled(r)) {
-		int i;
-
-		/*
-		 * If we have a single commit with finite generation
-		 * number, then the _with_gen algorithm is preferred.
-		 */
-		for (i = 0; i < cnt; i++) {
+		for (int i = 0; i < cnt; i++) {
 			if (commit_graph_generation(array[i]) < GENERATION_NUMBER_INFINITY)
 				return remove_redundant_with_gen(r, array, cnt);
 		}
@@ -477,12 +469,12 @@ int repo_in_merge_bases_many(struct repository *r, struct commit *commit,
 			     int nr_reference, struct commit **reference)
 {
 	struct commit_list *bases;
-	int ret = 0, i;
+	int ret = 0;
 	timestamp_t generation, max_generation = GENERATION_NUMBER_ZERO;
 
 	if (repo_parse_commit(r, commit))
 		return ret;
-	for (i = 0; i < nr_reference; i++) {
+	for (int i = 0; i < nr_reference; i++) {
 		if (repo_parse_commit(r, reference[i]))
 			return ret;
 
@@ -664,9 +656,7 @@ static enum contains_result contains_tag_algo(struct commit *candidate,
 	struct contains_stack contains_stack = { 0, 0, NULL };
 	enum contains_result result;
 	timestamp_t cutoff = GENERATION_NUMBER_INFINITY;
-	const struct commit_list *p;
-
-	for (p = want; p; p = p->next) {
+	for (const struct commit_list *p = want; p; p = p->next) {
 		timestamp_t generation;
 		struct commit *c = p->item;
 		load_commit_graph_info(the_repository, c);
diff --git a/commit.c b/commit.c
index ef679a0b93..6fdab479b8 100644
--- a/commit.c
+++ b/commit.c
@@ -217,7 +217,7 @@ int register_commit_graft(struct repository *r, struct commit_graft *graft,
 struct commit_graft *read_graft_line(struct strbuf *line)
 {
 	/* The format is just "Commit Parent1 Parent2 ...\n" */
-	int i, phase;
+	int i;
 	const char *tail = NULL;
 	struct commit_graft *graft = NULL;
 	struct object_id dummy_oid, *oid;
@@ -229,7 +229,7 @@ struct commit_graft *read_graft_line(struct strbuf *line)
 	 * phase 0 verifies line, counts hashes in line and allocates graft
 	 * phase 1 fills graft
 	 */
-	for (phase = 0; phase < 2; phase++) {
+	for (int phase = 0; phase < 2; phase++) {
 		oid = graft ? &graft->oid : &dummy_oid;
 		if (parse_oid_hex(line->buf, oid, &tail))
 			goto bad_graft_data;
@@ -309,17 +309,15 @@ struct commit_graft *lookup_commit_graft(struct repository *r, const struct obje
 
 int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
 {
-	int i, ret;
-	for (i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++)
+	int ret;
+	for (int i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++)
 		ret = fn(the_repository->parsed_objects->grafts[i], cb_data);
 	return ret;
 }
 
 void reset_commit_grafts(struct repository *r)
 {
-	int i;
-
-	for (i = 0; i < r->parsed_objects->grafts_nr; i++) {
+	for (int i = 0; i < r->parsed_objects->grafts_nr; i++) {
 		unparse_commit(r, &r->parsed_objects->grafts[i]->oid);
 		free(r->parsed_objects->grafts[i]);
 	}
@@ -525,9 +523,8 @@ int parse_commit_buffer(struct repository *r, struct commit *item, const void *b
 		pptr = &commit_list_insert(new_parent, pptr)->next;
 	}
 	if (graft) {
-		int i;
 		struct commit *new_parent;
-		for (i = 0; i < graft->nr_parent; i++) {
+		for (int i = 0; i < graft->nr_parent; i++) {
 			new_parent = lookup_commit(r,
 						   &graft->parent[i]);
 			if (!new_parent)
@@ -692,8 +689,8 @@ struct commit_list *copy_commit_list(struct commit_list *list)
 
 struct commit_list *reverse_commit_list(struct commit_list *list)
 {
-	struct commit_list *next = NULL, *current, *backup;
-	for (current = list; current; current = backup) {
+	struct commit_list *next = NULL, *backup;
+	for (struct commit_list *current = list; current; current = backup) {
 		backup = current->next;
 		current->next = next;
 		next = current;
@@ -1392,11 +1389,11 @@ struct commit_extra_header *read_commit_extra_headers(struct commit *commit,
 
 int for_each_mergetag(each_mergetag_fn fn, struct commit *commit, void *data)
 {
-	struct commit_extra_header *extra, *to_free;
+	struct commit_extra_header *to_free;
 	int res = 0;
 
 	to_free = read_commit_extra_headers(commit, NULL);
-	for (extra = to_free; !res && extra; extra = extra->next) {
+	for (struct commit_extra_header *extra = to_free; !res && extra; extra = extra->next) {
 		if (strcmp(extra->key, "mergetag"))
 			continue; /* not a merge tag */
 		res = fn(commit, extra, data);
diff --git a/compat/fsmonitor/fsm-health-win32.c b/compat/fsmonitor/fsm-health-win32.c
index 2aa8c219ac..d3bf58908b 100644
--- a/compat/fsmonitor/fsm-health-win32.c
+++ b/compat/fsmonitor/fsm-health-win32.c
@@ -221,9 +221,7 @@ static interval_fn *table[] = {
 static int call_all(struct fsmonitor_daemon_state *state,
 		    enum interval_fn_ctx ctx)
 {
-	int k;
-
-	for (k = 0; table[k]; k++) {
+	for (int k = 0; table[k]; k++) {
 		int r = table[k](state, ctx);
 		if (r)
 			return r;
diff --git a/compat/fsmonitor/fsm-listen-darwin.c b/compat/fsmonitor/fsm-listen-darwin.c
index 2fc67442eb..552c5d0ff7 100644
--- a/compat/fsmonitor/fsm-listen-darwin.c
+++ b/compat/fsmonitor/fsm-listen-darwin.c
@@ -208,13 +208,7 @@ static void fsevent_callback(ConstFSEventStreamRef streamRef UNUSED,
 	const char *slash;
 	char *resolved = NULL;
 	struct strbuf tmp = STRBUF_INIT;
-	int k;
-
-	/*
-	 * Build a list of all filesystem changes into a private/local
-	 * list and without holding any locks.
-	 */
-	for (k = 0; k < num_of_events; k++) {
+	for (int k = 0; k < num_of_events; k++) {
 		/*
 		 * On Mac, we receive an array of absolute paths.
 		 */
diff --git a/compat/mingw.c b/compat/mingw.c
index 320fb99a90..ec8e204976 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -277,7 +277,6 @@ int mingw_core_config(const char *var, const char *value,
 /* Normalizes NT paths as returned by some low-level APIs. */
 static wchar_t *normalize_ntpath(wchar_t *wbuf)
 {
-	int i;
 	/* fix absolute path prefixes */
 	if (wbuf[0] == '\\') {
 		/* strip NT namespace prefixes */
@@ -293,7 +292,7 @@ static wchar_t *normalize_ntpath(wchar_t *wbuf)
 		}
 	}
 	/* convert backslashes to slashes */
-	for (i = 0; wbuf[i]; i++)
+	for (int i = 0; wbuf[i]; i++)
 		if (wbuf[i] == '\\')
 			wbuf[i] = '/';
 	return wbuf;
@@ -1740,11 +1739,10 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
 		      GetVersion() >> 16 < 9200) &&
 		    !getenv("SUPPRESS_HANDLE_INHERITANCE_WARNING")) {
 			DWORD fl = 0;
-			int i;
 
 			setenv("SUPPRESS_HANDLE_INHERITANCE_WARNING", "1", 1);
 
-			for (i = 0; i < stdhandles_count; i++) {
+			for (int i = 0; i < stdhandles_count; i++) {
 				HANDLE h = stdhandles[i];
 				strbuf_addf(&buf, "handle #%d: %p (type %lx, "
 					    "handle info (%d) %lx\n", i, h,
diff --git a/compat/simple-ipc/ipc-unix-socket.c b/compat/simple-ipc/ipc-unix-socket.c
index 9b3f2cdf8c..c3ab8fe528 100644
--- a/compat/simple-ipc/ipc-unix-socket.c
+++ b/compat/simple-ipc/ipc-unix-socket.c
@@ -48,9 +48,7 @@ enum ipc_active_state ipc_get_active_state(const char *path)
 	 */
 	{
 		static const int delay[] = { 1, 10, 20, 40, -1 };
-		int i;
-
-		for (i = 0; S_ISREG(st.st_mode) && delay[i] > 0; i++) {
+		for (int i = 0; S_ISREG(st.st_mode) && delay[i] > 0; i++) {
 			sleep_millisec(delay[i]);
 			if (lstat(path, &st) == -1)
 				return IPC_STATE__INVALID_PATH;
@@ -92,11 +90,9 @@ static enum ipc_active_state connect_to_server(
 	const struct ipc_client_connect_options *options,
 	int *pfd)
 {
-	int k;
-
 	*pfd = -1;
 
-	for (k = 0; k < timeout_ms; k += WAIT_STEP_MS) {
+	for (int k = 0; k < timeout_ms; k += WAIT_STEP_MS) {
 		int fd = unix_stream_connect(path, options->uds_disallow_chdir);
 
 		if (fd != -1) {
@@ -832,7 +828,6 @@ int ipc_server_run_async(struct ipc_server_data **returned_server_data,
 	struct unix_ss_socket *server_socket = NULL;
 	struct ipc_server_data *server_data;
 	int sv[2];
-	int k;
 	int ret;
 	int nr_threads = opts->nr_threads;
 
@@ -892,7 +887,7 @@ int ipc_server_run_async(struct ipc_server_data **returned_server_data,
 			   accept_thread_proc, server_data->accept_thread))
 		die_errno(_("could not start accept_thread '%s'"), path);
 
-	for (k = 0; k < nr_threads; k++) {
+	for (int k = 0; k < nr_threads; k++) {
 		struct ipc_worker_thread_data *wtd;
 
 		wtd = xcalloc(1, sizeof(*wtd));
diff --git a/compat/simple-ipc/ipc-win32.c b/compat/simple-ipc/ipc-win32.c
index 8bfe51248e..c3af6394a7 100644
--- a/compat/simple-ipc/ipc-win32.c
+++ b/compat/simple-ipc/ipc-win32.c
@@ -760,7 +760,6 @@ int ipc_server_run_async(struct ipc_server_data **returned_server_data,
 	struct ipc_server_data *server_data;
 	wchar_t wpath[MAX_PATH];
 	HANDLE hPipeFirst = INVALID_HANDLE_VALUE;
-	int k;
 	int ret = 0;
 	int nr_threads = opts->nr_threads;
 
@@ -790,7 +789,7 @@ int ipc_server_run_async(struct ipc_server_data **returned_server_data,
 	if (nr_threads < 1)
 		nr_threads = 1;
 
-	for (k = 0; k < nr_threads; k++) {
+	for (int k = 0; k < nr_threads; k++) {
 		struct ipc_server_thread_data *std;
 
 		std = xcalloc(1, sizeof(*std));
diff --git a/compat/strcasestr.c b/compat/strcasestr.c
index 26896deca6..128bb44281 100644
--- a/compat/strcasestr.c
+++ b/compat/strcasestr.c
@@ -4,11 +4,8 @@ char *gitstrcasestr(const char *haystack, const char *needle)
 {
 	int nlen = strlen(needle);
 	int hlen = strlen(haystack) - nlen + 1;
-	int i;
-
-	for (i = 0; i < hlen; i++) {
-		int j;
-		for (j = 0; j < nlen; j++) {
+	for (int i = 0; i < hlen; i++) {
+		for (int j = 0; j < nlen; j++) {
 			unsigned char c1 = haystack[i+j];
 			unsigned char c2 = needle[j];
 			if (toupper(c1) != toupper(c2))
diff --git a/compat/terminal.c b/compat/terminal.c
index 0afda730f2..548a2c64a0 100644
--- a/compat/terminal.c
+++ b/compat/terminal.c
@@ -259,14 +259,13 @@ static DWORD cmode_in, cmode_out;
 void restore_term(void)
 {
 	if (use_stty) {
-		int i;
 		struct child_process cp = CHILD_PROCESS_INIT;
 
 		if (stty_restore.nr == 0)
 			return;
 
 		strvec_push(&cp.args, "stty");
-		for (i = 0; i < stty_restore.nr; i++)
+		for (int i = 0; i < stty_restore.nr; i++)
 			strvec_push(&cp.args, stty_restore.items[i].string);
 		run_command(&cp);
 		string_list_clear(&stty_restore, 0);
@@ -497,7 +496,7 @@ static int is_known_escape_sequence(const char *sequence)
 	if (!initialized) {
 		struct child_process cp = CHILD_PROCESS_INIT;
 		struct strbuf buf = STRBUF_INIT;
-		char *p, *eol;
+		char *p;
 
 		hashmap_init(&sequences, sequence_entry_cmp, NULL, 0);
 
@@ -505,7 +504,7 @@ static int is_known_escape_sequence(const char *sequence)
 		if (pipe_command(&cp, NULL, 0, &buf, 0, NULL, 0))
 			strbuf_setlen(&buf, 0);
 
-		for (eol = p = buf.buf; *p; p = eol + 1) {
+		for (char *eol = p = buf.buf; *p; p = eol + 1) {
 			p = strchr(p, '=');
 			if (!p)
 				break;
diff --git a/compat/unsetenv.c b/compat/unsetenv.c
index b9d34af613..dbd9f1703d 100644
--- a/compat/unsetenv.c
+++ b/compat/unsetenv.c
@@ -5,12 +5,12 @@ int gitunsetenv(const char *name)
 #if !defined(__MINGW32__)
      extern char **environ;
 #endif
-     int src, dst;
+     int dst;
      size_t nmln;
 
      nmln = strlen(name);
 
-     for (src = dst = 0; environ[src]; ++src) {
+     for (int src = dst = 0; environ[src]; ++src) {
 	  size_t enln;
 	  enln = strlen(environ[src]);
 	  if (enln > nmln) {
diff --git a/config.c b/config.c
index 3cfeb3d8bd..5b01b16aca 100644
--- a/config.c
+++ b/config.c
@@ -540,7 +540,7 @@ static inline int iskeychar(int c)
  */
 int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
 {
-	size_t i, baselen;
+	size_t baselen;
 	int dot;
 	const char *last_dot = strrchr(key, '.');
 
@@ -569,7 +569,7 @@ int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
 	*store_key = xmallocz(strlen(key));
 
 	dot = 0;
-	for (i = 0; key[i]; i++) {
+	for (size_t i = 0; key[i]; i++) {
 		unsigned char c = key[i];
 		if (c == '.')
 			dot = 1;
@@ -724,7 +724,6 @@ int git_config_from_parameters(config_fn_t fn, void *data)
 	if (env) {
 		unsigned long count;
 		char *endp;
-		int i;
 
 		count = strtoul(env, &endp, 10);
 		if (*endp) {
@@ -736,7 +735,7 @@ int git_config_from_parameters(config_fn_t fn, void *data)
 			goto out;
 		}
 
-		for (i = 0; i < count; i++) {
+		for (int i = 0; i < count; i++) {
 			const char *key, *value;
 
 			strbuf_addf(&envvar, "GIT_CONFIG_KEY_%d", i);
@@ -2138,13 +2137,13 @@ int config_with_options(config_fn_t fn, void *data,
 
 static void configset_iter(struct config_set *set, config_fn_t fn, void *data)
 {
-	int i, value_index;
+	int value_index;
 	struct string_list *values;
 	struct config_set_element *entry;
 	struct configset_list *list = &set->list;
 	struct config_context ctx = CONFIG_CONTEXT_INIT;
 
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		entry = list->items[i].e;
 		value_index = list->items[i].value_index;
 		values = &entry->value_list;
@@ -3815,9 +3814,7 @@ const char *config_scope_name(enum config_scope scope)
 
 int lookup_config(const char **mapping, int nr_mapping, const char *var)
 {
-	int i;
-
-	for (i = 0; i < nr_mapping; i++) {
+	for (int i = 0; i < nr_mapping; i++) {
 		const char *name = mapping[i];
 
 		if (name && !strcasecmp(var, name))
diff --git a/connect.c b/connect.c
index 0d77737a53..a65dfa4298 100644
--- a/connect.c
+++ b/connect.c
@@ -74,9 +74,7 @@ static NORETURN void die_initial_contact(int unexpected)
 /* Checks if the server supports the capability 'c' */
 int server_supports_v2(const char *c)
 {
-	int i;
-
-	for (i = 0; i < server_capabilities_v2.nr; i++) {
+	for (int i = 0; i < server_capabilities_v2.nr; i++) {
 		const char *out;
 		if (skip_prefix(server_capabilities_v2.v[i], c, &out) &&
 		    (!*out || *out == '='))
@@ -93,9 +91,7 @@ void ensure_server_supports_v2(const char *c)
 
 int server_feature_v2(const char *c, const char **v)
 {
-	int i;
-
-	for (i = 0; i < server_capabilities_v2.nr; i++) {
+	for (int i = 0; i < server_capabilities_v2.nr; i++) {
 		const char *out;
 		if (skip_prefix(server_capabilities_v2.v[i], c, &out) &&
 		    (*out == '=')) {
@@ -109,9 +105,7 @@ int server_feature_v2(const char *c, const char **v)
 int server_supports_feature(const char *c, const char *feature,
 			    int die_on_error)
 {
-	int i;
-
-	for (i = 0; i < server_capabilities_v2.nr; i++) {
+	for (int i = 0; i < server_capabilities_v2.nr; i++) {
 		const char *out;
 		if (skip_prefix(server_capabilities_v2.v[i], c, &out) &&
 		    (!*out || *(out++) == '=')) {
@@ -1447,7 +1441,6 @@ struct child_process *git_connect(int fd[2], const char *url,
 		conn->trace2_child_class = "transport/git";
 	} else {
 		struct strbuf cmd = STRBUF_INIT;
-		const char *const *var;
 
 		conn = xmalloc(sizeof(*conn));
 		child_process_init(conn);
@@ -1460,7 +1453,7 @@ struct child_process *git_connect(int fd[2], const char *url,
 		sq_quote_buf(&cmd, path);
 
 		/* remove repo-local variables from the environment */
-		for (var = local_repo_env; *var; var++)
+		for (const char * const *var = local_repo_env; *var; var++)
 			strvec_push(&conn->env, *var);
 
 		conn->use_shell = 1;
diff --git a/connected.c b/connected.c
index 8f89376dbc..e0f3ec0ac7 100644
--- a/connected.c
+++ b/connected.c
@@ -71,9 +71,7 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
 		 */
 		reprepare_packed_git(the_repository);
 		do {
-			struct packed_git *p;
-
-			for (p = get_all_packs(the_repository); p; p = p->next) {
+			for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 				if (!p->pack_promisor)
 					continue;
 				if (find_pack_entry_one(oid->hash, p))
diff --git a/convert.c b/convert.c
index 35b25eb3cb..9c3421041e 100644
--- a/convert.c
+++ b/convert.c
@@ -41,11 +41,9 @@ struct text_stat {
 
 static void gather_stats(const char *buf, unsigned long size, struct text_stat *stats)
 {
-	unsigned long i;
-
 	memset(stats, 0, sizeof(*stats));
 
-	for (i = 0; i < size; i++) {
+	for (unsigned long i = 0; i < size; i++) {
 		unsigned char c = buf[i];
 		if (c == '\r') {
 			if (i+1 < size && buf[i+1] == '\n') {
@@ -320,10 +318,9 @@ static void trace_encoding(const char *context, const char *path,
 {
 	static struct trace_key coe = TRACE_KEY_INIT(WORKING_TREE_ENCODING);
 	struct strbuf trace = STRBUF_INIT;
-	int i;
 
 	strbuf_addf(&trace, "%s (%s, considered %s):\n", context, path, encoding);
-	for (i = 0; i < len && buf; ++i) {
+	for (int i = 0; i < len && buf; ++i) {
 		strbuf_addf(
 			&trace, "| \033[2m%2i:\033[0m %2x \033[2m%c\033[0m%c",
 			i,
@@ -1283,11 +1280,10 @@ static enum eol git_path_check_eol(struct attr_check_item *check)
 static struct convert_driver *git_path_check_convert(struct attr_check_item *check)
 {
 	const char *value = check->value;
-	struct convert_driver *drv;
 
 	if (ATTR_TRUE(value) || ATTR_FALSE(value) || ATTR_UNSET(value))
 		return NULL;
-	for (drv = user_convert; drv; drv = drv->next)
+	for (struct convert_driver *drv = user_convert; drv; drv = drv->next)
 		if (!strcmp(value, drv->name))
 			return drv;
 	return NULL;
@@ -1349,13 +1345,13 @@ void convert_attrs(struct index_state *istate,
 
 void reset_parsed_attributes(void)
 {
-	struct convert_driver *drv, *next;
+	struct convert_driver *next;
 
 	attr_check_free(check);
 	check = NULL;
 	reset_merge_attributes();
 
-	for (drv = user_convert; drv; drv = next) {
+	for (struct convert_driver *drv = user_convert; drv; drv = next) {
 		next = drv->next;
 		free((void *)drv->name);
 		free(drv);
@@ -1822,11 +1818,9 @@ struct ident_filter {
 
 static int is_foreign_ident(const char *str)
 {
-	int i;
-
 	if (!skip_prefix(str, "$Id: ", &str))
 		return 0;
-	for (i = 0; str[i]; i++) {
+	for (int i = 0; str[i]; i++) {
 		if (isspace(str[i]) && str[i+1] != '$')
 			return 1;
 	}
diff --git a/credential.c b/credential.c
index 18098bd35e..8653873926 100644
--- a/credential.c
+++ b/credential.c
@@ -359,14 +359,12 @@ static int credential_do(struct credential *c, const char *helper,
 
 void credential_fill(struct credential *c)
 {
-	int i;
-
 	if (c->username && c->password)
 		return;
 
 	credential_apply_config(c);
 
-	for (i = 0; i < c->helpers.nr; i++) {
+	for (int i = 0; i < c->helpers.nr; i++) {
 		credential_do(c, c->helpers.items[i].string, "get");
 		if (c->password_expiry_utc < time(NULL)) {
 			/* Discard expired password */
@@ -388,8 +386,6 @@ void credential_fill(struct credential *c)
 
 void credential_approve(struct credential *c)
 {
-	int i;
-
 	if (c->approved)
 		return;
 	if (!c->username || !c->password || c->password_expiry_utc < time(NULL))
@@ -397,18 +393,16 @@ void credential_approve(struct credential *c)
 
 	credential_apply_config(c);
 
-	for (i = 0; i < c->helpers.nr; i++)
+	for (int i = 0; i < c->helpers.nr; i++)
 		credential_do(c, c->helpers.items[i].string, "store");
 	c->approved = 1;
 }
 
 void credential_reject(struct credential *c)
 {
-	int i;
-
 	credential_apply_config(c);
 
-	for (i = 0; i < c->helpers.nr; i++)
+	for (int i = 0; i < c->helpers.nr; i++)
 		credential_do(c, c->helpers.items[i].string, "erase");
 
 	FREE_AND_NULL(c->username);
diff --git a/daemon.c b/daemon.c
index 17d331b2f3..5cda62b3e0 100644
--- a/daemon.c
+++ b/daemon.c
@@ -255,7 +255,6 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
 	}
 
 	if ( ok_paths && *ok_paths ) {
-		const char **pp;
 		int pathlen = strlen(path);
 
 		/* The validation is done on the paths after enter_repo
@@ -265,7 +264,7 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
 		 * do not have to say /mnt/pub.
 		 * Do not say /pub/.
 		 */
-		for ( pp = ok_paths ; *pp ; pp++ ) {
+		for (const char **pp = ok_paths; *pp; pp++) {
 			int len = strlen(*pp);
 			if (len <= pathlen &&
 			    !memcmp(*pp, path, len) &&
@@ -499,8 +498,7 @@ static struct daemon_service daemon_service[] = {
 
 static void enable_service(const char *name, int ena)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(daemon_service); i++) {
+	for (int i = 0; i < ARRAY_SIZE(daemon_service); i++) {
 		if (!strcmp(daemon_service[i].name, name)) {
 			daemon_service[i].enabled = ena;
 			return;
@@ -511,8 +509,7 @@ static void enable_service(const char *name, int ena)
 
 static void make_service_overridable(const char *name, int ena)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(daemon_service); i++) {
+	for (int i = 0; i < ARRAY_SIZE(daemon_service); i++) {
 		if (!strcmp(daemon_service[i].name, name)) {
 			daemon_service[i].overridable = ena;
 			return;
@@ -733,7 +730,7 @@ static void set_keep_alive(int sockfd)
 static int execute(void)
 {
 	char *line = packet_buffer;
-	int pktlen, len, i;
+	int pktlen, len;
 	char *addr = getenv("REMOTE_ADDR"), *port = getenv("REMOTE_PORT");
 	struct hostinfo hi = HOSTINFO_INIT;
 	struct strvec env = STRVEC_INIT;
@@ -754,7 +751,7 @@ static int execute(void)
 	if (len != pktlen)
 		parse_extra_args(&hi, &env, line + len + 1, pktlen - len - 1);
 
-	for (i = 0; i < ARRAY_SIZE(daemon_service); i++) {
+	for (int i = 0; i < ARRAY_SIZE(daemon_service); i++) {
 		struct daemon_service *s = &(daemon_service[i]);
 		const char *arg;
 
@@ -965,7 +962,7 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
 {
 	int socknum = 0;
 	char pbuf[NI_MAXSERV];
-	struct addrinfo hints, *ai0, *ai;
+	struct addrinfo hints, *ai0;
 	int gai;
 	long flags;
 
@@ -982,7 +979,7 @@ static int setup_named_sock(char *listen_addr, int listen_port, struct socketlis
 		return 0;
 	}
 
-	for (ai = ai0; ai; ai = ai->ai_next) {
+	for (struct addrinfo *ai = ai0; ai; ai = ai->ai_next) {
 		int sockfd;
 
 		sockfd = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
@@ -1104,8 +1101,8 @@ static void socksetup(struct string_list *listen_addr, int listen_port, struct s
 	if (!listen_addr->nr)
 		setup_named_sock(NULL, listen_port, socklist);
 	else {
-		int i, socknum;
-		for (i = 0; i < listen_addr->nr; i++) {
+		int socknum;
+		for (int i = 0; i < listen_addr->nr; i++) {
 			socknum = setup_named_sock(listen_addr->items[i].string,
 						   listen_port, socklist);
 
diff --git a/date.c b/date.c
index 619ada5b20..995aeb2a1f 100644
--- a/date.c
+++ b/date.c
@@ -1211,7 +1211,6 @@ static const struct typelen {
 static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm *now, int *num, int *touched)
 {
 	const struct typelen *tl;
-	const struct special *s;
 	const char *end = date;
 	int i;
 
@@ -1227,7 +1226,7 @@ static const char *approxidate_alpha(const char *date, struct tm *tm, struct tm
 		}
 	}
 
-	for (s = special; s->name; s++) {
+	for (const struct special *s = special; s->name; s++) {
 		int len = strlen(s->name);
 		if (match_string(date, s->name) == len) {
 			s->fn(tm, now, num);
diff --git a/decorate.c b/decorate.c
index 69aeb142b4..bf25f27169 100644
--- a/decorate.c
+++ b/decorate.c
@@ -34,7 +34,6 @@ static void *insert_decoration(struct decoration *n, const struct object *base,
 
 static void grow_decoration(struct decoration *n)
 {
-	int i;
 	int old_size = n->size;
 	struct decoration_entry *old_entries = n->entries;
 
@@ -42,7 +41,7 @@ static void grow_decoration(struct decoration *n)
 	CALLOC_ARRAY(n->entries, n->size);
 	n->nr = 0;
 
-	for (i = 0; i < old_size; i++) {
+	for (int i = 0; i < old_size; i++) {
 		const struct object *base = old_entries[i].base;
 		void *decoration = old_entries[i].decoration;
 
@@ -85,8 +84,7 @@ void *lookup_decoration(struct decoration *n, const struct object *obj)
 void clear_decoration(struct decoration *n, void (*free_cb)(void *))
 {
 	if (free_cb) {
-		unsigned int i;
-		for (i = 0; i < n->size; i++) {
+		for (unsigned int i = 0; i < n->size; i++) {
 			void *d = n->entries[i].decoration;
 			if (d)
 				free_cb(d);
diff --git a/delta-islands.c b/delta-islands.c
index ee2318d45a..de80a8786d 100644
--- a/delta-islands.c
+++ b/delta-islands.c
@@ -53,21 +53,17 @@ static struct island_bitmap *island_bitmap_new(const struct island_bitmap *old)
 
 static void island_bitmap_or(struct island_bitmap *a, const struct island_bitmap *b)
 {
-	uint32_t i;
-
-	for (i = 0; i < island_bitmap_size; ++i)
+	for (uint32_t i = 0; i < island_bitmap_size; ++i)
 		a->bits[i] |= b->bits[i];
 }
 
 static int island_bitmap_is_subset(struct island_bitmap *self,
 		struct island_bitmap *super)
 {
-	uint32_t i;
-
 	if (self == super)
 		return 1;
 
-	for (i = 0; i < island_bitmap_size; ++i) {
+	for (uint32_t i = 0; i < island_bitmap_size; ++i) {
 		if ((self->bits[i] & super->bits[i]) != self->bits[i])
 			return 0;
 	}
@@ -189,9 +185,7 @@ static void mark_remote_island_1(struct repository *r,
 				 struct remote_island *rl,
 				 int is_core_island)
 {
-	uint32_t i;
-
-	for (i = 0; i < rl->oids.nr; ++i) {
+	for (uint32_t i = 0; i < rl->oids.nr; ++i) {
 		struct island_bitmap *marks;
 		struct object *obj = parse_object(r, &rl->oids.oid[i]);
 
@@ -399,7 +393,7 @@ static int find_island_for_ref(const char *refname, const struct object_id *oid,
 	 * than we support.
 	 */
 	regmatch_t matches[16];
-	int i, m;
+	int i;
 	struct strbuf island_name = STRBUF_INIT;
 
 	/* walk backwards to get last-one-wins ordering */
@@ -417,7 +411,7 @@ static int find_island_for_ref(const char *refname, const struct object_id *oid,
 			  "too many capture groups (max=%d)"),
 			(int)ARRAY_SIZE(matches) - 2);
 
-	for (m = 1; m < ARRAY_SIZE(matches); m++) {
+	for (int m = 1; m < ARRAY_SIZE(matches); m++) {
 		regmatch_t *match = &matches[m];
 
 		if (match->rm_so == -1)
@@ -448,7 +442,7 @@ static struct remote_island *get_core_island(kh_str_t *remote_islands)
 static void deduplicate_islands(kh_str_t *remote_islands, struct repository *r)
 {
 	struct remote_island *island, *core = NULL, **list;
-	unsigned int island_count, dst, src, ref, i = 0;
+	unsigned int island_count, dst, src, i = 0;
 
 	island_count = kh_size(remote_islands);
 	ALLOC_ARRAY(list, island_count);
@@ -457,7 +451,7 @@ static void deduplicate_islands(kh_str_t *remote_islands, struct repository *r)
 		list[i++] = island;
 	});
 
-	for (ref = 0; ref + 1 < island_count; ref++) {
+	for (unsigned int ref = 0; ref + 1 < island_count; ref++) {
 		for (src = ref + 1, dst = src; src < island_count; src++) {
 			if (list[ref]->hash == list[src]->hash)
 				continue;
@@ -502,13 +496,12 @@ void propagate_island_marks(struct commit *commit)
 	khiter_t pos = kh_get_oid_map(island_marks, commit->object.oid);
 
 	if (pos < kh_end(island_marks)) {
-		struct commit_list *p;
 		struct island_bitmap *root_marks = kh_value(island_marks, pos);
 
 		repo_parse_commit(the_repository, commit);
 		set_island_marks(&repo_get_commit_tree(the_repository, commit)->object,
 				 root_marks);
-		for (p = commit->parents; p; p = p->next)
+		for (struct commit_list *p = commit->parents; p; p = p->next)
 			set_island_marks(&p->item->object, root_marks);
 	}
 }
@@ -531,12 +524,10 @@ void free_island_marks(void)
 
 int compute_pack_layers(struct packing_data *to_pack)
 {
-	uint32_t i;
-
 	if (!core_island_name || !island_marks)
 		return 1;
 
-	for (i = 0; i < to_pack->nr_objects; ++i) {
+	for (uint32_t i = 0; i < to_pack->nr_objects; ++i) {
 		struct object_entry *entry = &to_pack->objects[i];
 		khiter_t pos = kh_get_oid_map(island_marks, entry->idx.oid);
 
diff --git a/diagnose.c b/diagnose.c
index 4d096c857f..9c3159f26d 100644
--- a/diagnose.c
+++ b/diagnose.c
@@ -29,7 +29,6 @@ static struct diagnose_option diagnose_options[] = {
 
 int option_parse_diagnose(const struct option *opt, const char *arg, int unset)
 {
-	int i;
 	enum diagnose_mode *diagnose = opt->value;
 
 	if (!arg) {
@@ -37,7 +36,7 @@ int option_parse_diagnose(const struct option *opt, const char *arg, int unset)
 		return 0;
 	}
 
-	for (i = 0; i < ARRAY_SIZE(diagnose_options); i++) {
+	for (int i = 0; i < ARRAY_SIZE(diagnose_options); i++) {
 		if (!strcmp(arg, diagnose_options[i].option_name)) {
 			*diagnose = diagnose_options[i].mode;
 			return 0;
diff --git a/diff-delta.c b/diff-delta.c
index 77fea08dfb..f14aedad5c 100644
--- a/diff-delta.c
+++ b/diff-delta.c
@@ -133,7 +133,7 @@ struct delta_index {
 struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
 {
 	unsigned int i, hsize, hmask, entries, prev_val, *hash_count;
-	const unsigned char *data, *buffer = buf;
+	const unsigned char *buffer = buf;
 	struct delta_index *index;
 	struct unpacked_index_entry *entry, **hash;
 	struct index_entry *packed_entry, **packed_hash;
@@ -180,9 +180,7 @@ struct delta_index * create_delta_index(const void *buf, unsigned long bufsize)
 
 	/* then populate the index */
 	prev_val = ~0;
-	for (data = buffer + entries * RABIN_WINDOW - RABIN_WINDOW;
-	     data >= buffer;
-	     data -= RABIN_WINDOW) {
+	for (const unsigned char *data = buffer + entries * RABIN_WINDOW - RABIN_WINDOW; data >= buffer; data -= RABIN_WINDOW) {
 		unsigned int val = 0;
 		for (i = 1; i <= RABIN_WINDOW; i++)
 			val = ((val << 8) | data[i]) ^ T[val >> RABIN_SHIFT];
diff --git a/diff-lib.c b/diff-lib.c
index 6c8df04273..bbbc8b131a 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -103,7 +103,7 @@ static int match_stat_with_submodule(struct diff_options *diffopt,
 
 void run_diff_files(struct rev_info *revs, unsigned int option)
 {
-	int entries, i;
+	int entries;
 	int diff_unmerged_stage = revs->max_count;
 	unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED)
 			      ? CE_MATCH_RACY_IS_DIRTY : 0);
@@ -117,7 +117,7 @@ void run_diff_files(struct rev_info *revs, unsigned int option)
 	if (diff_unmerged_stage < 0)
 		diff_unmerged_stage = 2;
 	entries = istate->cache_nr;
-	for (i = 0; i < entries; i++) {
+	for (int i = 0; i < entries; i++) {
 		unsigned int oldmode, newmode;
 		struct cache_entry *ce = istate->cache[i];
 		int changed;
diff --git a/diff.c b/diff.c
index e50def4538..e65533bc97 100644
--- a/diff.c
+++ b/diff.c
@@ -136,11 +136,10 @@ static int parse_dirstat_params(struct diff_options *options, const char *params
 	char *params_copy = xstrdup(params_string);
 	struct string_list params = STRING_LIST_INIT_NODUP;
 	int ret = 0;
-	int i;
 
 	if (*params_copy)
 		string_list_split_in_place(&params, params_copy, ",", -1);
-	for (i = 0; i < params.nr; i++) {
+	for (int i = 0; i < params.nr; i++) {
 		const char *p = params.items[i].string;
 		if (!strcmp(p, "changes")) {
 			options->flags.dirstat_by_line = 0;
@@ -992,12 +991,11 @@ static struct moved_entry_list *add_lines_to_move_detection(struct diff_options
 	struct moved_entry_list *entry_list = NULL;
 	size_t entry_list_alloc = 0;
 	unsigned id = 0;
-	int n;
 
 	hashmap_init(&interned_map, interned_diff_symbol_cmp, o, 8096);
 	mem_pool_init(&interned_pool, 1024 * 1024);
 
-	for (n = 0; n < o->emitted_symbols->nr; n++) {
+	for (int n = 0; n < o->emitted_symbols->nr; n++) {
 		struct interned_diff_symbol key;
 		struct emitted_diff_symbol *l = &o->emitted_symbols->buf[n];
 		struct interned_diff_symbol *s;
@@ -1232,8 +1230,7 @@ static void mark_color_as_moved(struct diff_options *o,
 
 static void dim_moved_lines(struct diff_options *o)
 {
-	int n;
-	for (n = 0; n < o->emitted_symbols->nr; n++) {
+	for (int n = 0; n < o->emitted_symbols->nr; n++) {
 		struct emitted_diff_symbol *prev = (n != 0) ?
 				&o->emitted_symbols->buf[n - 1] : NULL;
 		struct emitted_diff_symbol *l = &o->emitted_symbols->buf[n];
@@ -1714,8 +1711,7 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
 
 static struct diff_tempfile *claim_diff_tempfile(void)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(diff_temp); i++)
+	for (int i = 0; i < ARRAY_SIZE(diff_temp); i++)
 		if (!diff_temp[i].name)
 			return diff_temp + i;
 	BUG("diff is failing to clean up its tempfiles");
@@ -1723,8 +1719,7 @@ static struct diff_tempfile *claim_diff_tempfile(void)
 
 static void remove_tempfile(void)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(diff_temp); i++) {
+	for (int i = 0; i < ARRAY_SIZE(diff_temp); i++) {
 		if (is_tempfile_active(diff_temp[i].tempfile))
 			delete_tempfile(&diff_temp[i].tempfile);
 		diff_temp[i].name = NULL;
@@ -2083,7 +2078,7 @@ static int find_word_boundaries(mmfile_t *buffer, regex_t *word_regex,
 static void diff_words_fill(struct diff_words_buffer *buffer, mmfile_t *out,
 		regex_t *word_regex)
 {
-	int i, j;
+	int j;
 	long alloc = 0;
 
 	out->size = 0;
@@ -2094,7 +2089,7 @@ static void diff_words_fill(struct diff_words_buffer *buffer, mmfile_t *out,
 	buffer->orig[0].begin = buffer->orig[0].end = buffer->text.ptr;
 	buffer->orig_nr = 1;
 
-	for (i = 0; i < buffer->text.size; i++) {
+	for (int i = 0; i < buffer->text.size; i++) {
 		if (find_word_boundaries(&buffer->text, word_regex, &i, &j))
 			return;
 
@@ -2224,7 +2219,6 @@ static void init_diff_words_data(struct emit_callback *ecbdata,
 				 struct diff_filespec *one,
 				 struct diff_filespec *two)
 {
-	int i;
 	struct diff_options *o = xmalloc(sizeof(struct diff_options));
 	memcpy(o, orig_opts, sizeof(struct diff_options));
 
@@ -2250,7 +2244,7 @@ static void init_diff_words_data(struct emit_callback *ecbdata,
 			die("invalid regular expression: %s",
 			    o->word_regex);
 	}
-	for (i = 0; i < ARRAY_SIZE(diff_words_styles); i++) {
+	for (int i = 0; i < ARRAY_SIZE(diff_words_styles); i++) {
 		if (o->word_diff == diff_words_styles[i].type) {
 			ecbdata->diff_words->style =
 				&diff_words_styles[i];
@@ -2906,12 +2900,12 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
 
 static void show_shortstats(struct diffstat_t *data, struct diff_options *options)
 {
-	int i, adds = 0, dels = 0, total_files = data->nr;
+	int adds = 0, dels = 0, total_files = data->nr;
 
 	if (data->nr == 0)
 		return;
 
-	for (i = 0; i < data->nr; i++) {
+	for (int i = 0; i < data->nr; i++) {
 		int added = data->files[i]->added;
 		int deleted = data->files[i]->deleted;
 
@@ -2928,12 +2922,10 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option
 
 static void show_numstat(struct diffstat_t *data, struct diff_options *options)
 {
-	int i;
-
 	if (data->nr == 0)
 		return;
 
-	for (i = 0; i < data->nr; i++) {
+	for (int i = 0; i < data->nr; i++) {
 		struct diffstat_file *file = data->files[i];
 
 		fprintf(options->file, "%s", diff_line_prefix(options));
@@ -3051,7 +3043,6 @@ static void conclude_dirstat(struct diff_options *options,
 
 static void show_dirstat(struct diff_options *options)
 {
-	int i;
 	unsigned long changed;
 	struct dirstat_dir dir;
 	struct diff_queue_struct *q = &diff_queued_diff;
@@ -3063,7 +3054,7 @@ static void show_dirstat(struct diff_options *options)
 	dir.cumulative = options->flags.dirstat_cumulative;
 
 	changed = 0;
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		const char *name;
 		unsigned long copied, added, damage;
@@ -3143,7 +3134,6 @@ static void show_dirstat(struct diff_options *options)
 
 static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *options)
 {
-	int i;
 	unsigned long changed;
 	struct dirstat_dir dir;
 
@@ -3157,7 +3147,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o
 	dir.cumulative = options->flags.dirstat_cumulative;
 
 	changed = 0;
-	for (i = 0; i < data->nr; i++) {
+	for (int i = 0; i < data->nr; i++) {
 		struct diffstat_file *file = data->files[i];
 		unsigned long damage = file->added + file->deleted;
 		if (file->is_binary)
@@ -3189,8 +3179,7 @@ static void free_diffstat_file(struct diffstat_file *f)
 
 void free_diffstat_info(struct diffstat_t *diffstat)
 {
-	int i;
-	for (i = 0; i < diffstat->nr; i++)
+	for (int i = 0; i < diffstat->nr; i++)
 		free_diffstat_file(diffstat->files[i]);
 	free(diffstat->files);
 }
@@ -3453,9 +3442,9 @@ static void add_formatted_header(struct strbuf *msg,
 				  const char *meta,
 				  const char *reset)
 {
-	const char *next, *newline;
+	const char *newline;
 
-	for (next = header; *next; next = newline) {
+	for (const char *next = header; *next; next = newline) {
 		newline = strchrnul(next, '\n');
 		strbuf_addf(msg, "%s%s%.*s%s\n", line_prefix, meta,
 			    (int)(newline - next), next, reset);
@@ -3470,9 +3459,7 @@ static void add_formatted_headers(struct strbuf *msg,
 				  const char *meta,
 				  const char *reset)
 {
-	int i;
-
-	for (i = 0; i < more_headers->nr; i++)
+	for (int i = 0; i < more_headers->nr; i++)
 		add_formatted_header(msg, more_headers->items[i].string,
 				     line_prefix, meta, reset);
 }
@@ -5022,12 +5009,12 @@ static int diff_opt_diff_filter(const struct option *option,
 				const char *optarg, int unset)
 {
 	struct diff_options *opt = option->value;
-	int i, optch;
+	int optch;
 
 	BUG_ON_OPT_NEG(unset);
 	prepare_filter_bits();
 
-	for (i = 0; (optch = optarg[i]) != '\0'; i++) {
+	for (int i = 0; (optch = optarg[i]) != '\0'; i++) {
 		unsigned int bit;
 		int negate;
 
@@ -5387,7 +5374,6 @@ static int diff_opt_patience(const struct option *opt,
 			     const char *arg, int unset)
 {
 	struct diff_options *options = opt->value;
-	int i;
 
 	BUG_ON_OPT_NEG(unset);
 	BUG_ON_OPT_ARG(arg);
@@ -5396,7 +5382,7 @@ static int diff_opt_patience(const struct option *opt,
 	 * internally, so remove any anchors previously
 	 * specified.
 	 */
-	for (i = 0; i < options->anchors_nr; i++)
+	for (int i = 0; i < options->anchors_nr; i++)
 		free(options->anchors[i]);
 	options->anchors_nr = 0;
 	options->ignore_driver_algorithm = 1;
@@ -6096,7 +6082,6 @@ static void diff_flush_checkdiff(struct diff_filepair *p,
 int diff_queue_is_empty(struct diff_options *o)
 {
 	struct diff_queue_struct *q = &diff_queued_diff;
-	int i;
 	int include_conflict_headers =
 	    (o->additional_path_headers &&
 	     strmap_get_size(o->additional_path_headers) &&
@@ -6106,7 +6091,7 @@ int diff_queue_is_empty(struct diff_options *o)
 	if (include_conflict_headers)
 		return 0;
 
-	for (i = 0; i < q->nr; i++)
+	for (int i = 0; i < q->nr; i++)
 		if (!diff_unmodified_pair(q->queue[i]))
 			return 0;
 	return 1;
@@ -6137,11 +6122,10 @@ void diff_debug_filepair(const struct diff_filepair *p, int i)
 
 void diff_debug_queue(const char *msg, struct diff_queue_struct *q)
 {
-	int i;
 	if (msg)
 		fprintf(stderr, "%s\n", msg);
 	fprintf(stderr, "q->nr = %d\n", q->nr);
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		diff_debug_filepair(p, i);
 	}
@@ -6150,13 +6134,12 @@ void diff_debug_queue(const char *msg, struct diff_queue_struct *q)
 
 static void diff_resolve_rename_copy(void)
 {
-	int i;
 	struct diff_filepair *p;
 	struct diff_queue_struct *q = &diff_queued_diff;
 
 	diff_debug_queue("resolve-rename-copy", q);
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		p = q->queue[i];
 		p->status = 0; /* undecided */
 		if (DIFF_PAIR_UNMERGED(p))
@@ -6326,11 +6309,10 @@ struct patch_id_t {
 
 static int remove_space(char *line, int len)
 {
-	int i;
 	char *dst = line;
 	unsigned char c;
 
-	for (i = 0; i < len; i++)
+	for (int i = 0; i < len; i++)
 		if (!isspace((c = line[i])))
 			*dst++ = c;
 
@@ -6341,12 +6323,11 @@ void flush_one_hunk(struct object_id *result, git_hash_ctx *ctx)
 {
 	unsigned char hash[GIT_MAX_RAWSZ];
 	unsigned short carry = 0;
-	int i;
 
 	the_hash_algo->final_fn(hash, ctx);
 	the_hash_algo->init_fn(ctx);
 	/* 20-byte sum, with carry */
-	for (i = 0; i < the_hash_algo->rawsz; ++i) {
+	for (int i = 0; i < the_hash_algo->rawsz; ++i) {
 		carry += result->hash[i] + hash[i];
 		result->hash[i] = carry;
 		carry >>= 8;
@@ -6384,7 +6365,6 @@ static void patch_id_add_mode(git_hash_ctx *ctx, unsigned mode)
 static int diff_get_patch_id(struct diff_options *options, struct object_id *oid, int diff_header_only)
 {
 	struct diff_queue_struct *q = &diff_queued_diff;
-	int i;
 	git_hash_ctx ctx;
 	struct patch_id_t data;
 
@@ -6393,7 +6373,7 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oid
 	data.ctx = &ctx;
 	oidclr(oid);
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		xpparam_t xpp;
 		xdemitconf_t xecfg;
 		mmfile_t mf1, mf2;
@@ -6492,9 +6472,7 @@ int diff_flush_patch_id(struct diff_options *options, struct object_id *oid, int
 
 static int is_summary_empty(const struct diff_queue_struct *q)
 {
-	int i;
-
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		const struct diff_filepair *p = q->queue[i];
 
 		switch (p->status) {
@@ -6544,7 +6522,6 @@ static void create_filepairs_for_header_only_notifications(struct diff_options *
 	struct diff_queue_struct *q = &diff_queued_diff;
 	struct hashmap_iter iter;
 	struct strmap_entry *e;
-	int i;
 
 	strset_init_with_options(&present, /*pool*/ NULL, /*strdup*/ 0);
 
@@ -6552,7 +6529,7 @@ static void create_filepairs_for_header_only_notifications(struct diff_options *
 	 * Find out which paths exist in diff_queued_diff, preferring
 	 * one->path for any pair that has multiple paths.
 	 */
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		char *path = p->one->path ? p->one->path : p->two->path;
 
@@ -6642,9 +6619,7 @@ static void diff_free_file(struct diff_options *options)
 
 static void diff_free_ignore_regex(struct diff_options *options)
 {
-	int i;
-
-	for (i = 0; i < options->ignore_regex_nr; i++) {
+	for (int i = 0; i < options->ignore_regex_nr; i++) {
 		regfree(options->ignore_regex[i]);
 		free(options->ignore_regex[i]);
 	}
@@ -6878,12 +6853,11 @@ static int diff_filespec_check_stat_unmatch(struct repository *r,
 
 static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
 {
-	int i;
 	struct diff_queue_struct *q = &diff_queued_diff;
 	struct diff_queue_struct outq;
 	DIFF_QUEUE_CLEAR(&outq);
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 
 		if (diff_filespec_check_stat_unmatch(diffopt->repo, p))
@@ -6934,11 +6908,10 @@ void diff_add_if_missing(struct repository *r,
 void diff_queued_diff_prefetch(void *repository)
 {
 	struct repository *repo = repository;
-	int i;
 	struct diff_queue_struct *q = &diff_queued_diff;
 	struct oid_array to_fetch = OID_ARRAY_INIT;
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		diff_add_if_missing(repo, &to_fetch, p->one);
 		diff_add_if_missing(repo, &to_fetch, p->two);
@@ -7058,10 +7031,8 @@ void compute_diffstat(struct diff_options *options,
 		      struct diffstat_t *diffstat,
 		      struct diff_queue_struct *q)
 {
-	int i;
-
 	memset(diffstat, 0, sizeof(struct diffstat_t));
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		if (check_pair_status(p))
 			diff_flush_stat(p, options, diffstat);
diff --git a/diff.h b/diff.h
index 66bd8aeb29..f842799298 100644
--- a/diff.h
+++ b/diff.h
@@ -205,9 +205,7 @@ static inline void diff_flags_or(struct diff_flags *a,
 {
 	char *tmp_a = (char *)a;
 	const char *tmp_b = (const char *)b;
-	int i;
-
-	for (i = 0; i < sizeof(struct diff_flags); i++)
+	for (int i = 0; i < sizeof(struct diff_flags); i++)
 		tmp_a[i] |= tmp_b[i];
 }
 
diff --git a/diffcore-break.c b/diffcore-break.c
index 49ba38aa7c..98e4089271 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -162,7 +162,6 @@ void diffcore_break(struct repository *r, int break_score)
 	 * together).
 	 */
 	int merge_score;
-	int i;
 
 	/* See comment on DEFAULT_BREAK_SCORE and
 	 * DEFAULT_MERGE_SCORE in diffcore.h
@@ -177,7 +176,7 @@ void diffcore_break(struct repository *r, int break_score)
 
 	DIFF_QUEUE_CLEAR(&outq);
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		int score;
 
@@ -273,11 +272,11 @@ void diffcore_merge_broken(void)
 {
 	struct diff_queue_struct *q = &diff_queued_diff;
 	struct diff_queue_struct outq;
-	int i, j;
+	int j;
 
 	DIFF_QUEUE_CLEAR(&outq);
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		if (!p)
 			/* we already merged this with its peer */
diff --git a/diffcore-delta.c b/diffcore-delta.c
index ba6cbee76b..59d2b858ba 100644
--- a/diffcore-delta.c
+++ b/diffcore-delta.c
@@ -48,7 +48,6 @@ struct spanhash_top {
 static struct spanhash_top *spanhash_rehash(struct spanhash_top *orig)
 {
 	struct spanhash_top *new_spanhash;
-	int i;
 	int osz = 1 << orig->alloc_log2;
 	int sz = osz << 1;
 
@@ -57,7 +56,7 @@ static struct spanhash_top *spanhash_rehash(struct spanhash_top *orig)
 	new_spanhash->alloc_log2 = orig->alloc_log2 + 1;
 	new_spanhash->free = INITIAL_FREE(new_spanhash->alloc_log2);
 	memset(new_spanhash->data, 0, sizeof(struct spanhash) * sz);
-	for (i = 0; i < osz; i++) {
+	for (int i = 0; i < osz; i++) {
 		struct spanhash *o = &(orig->data[i]);
 		int bucket;
 		if (!o->cnt)
diff --git a/diffcore-order.c b/diffcore-order.c
index e7d20ebd2d..4066f8063f 100644
--- a/diffcore-order.c
+++ b/diffcore-order.c
@@ -12,7 +12,7 @@ static int order_cnt;
 
 static void prepare_order(const char *orderfile)
 {
-	int cnt, pass;
+	int cnt;
 	struct strbuf sb = STRBUF_INIT;
 	void *map;
 	char *cp, *endp;
@@ -27,7 +27,7 @@ static void prepare_order(const char *orderfile)
 	map = strbuf_detach(&sb, NULL);
 	endp = (char *) map + sz;
 
-	for (pass = 0; pass < 2; pass++) {
+	for (int pass = 0; pass < 2; pass++) {
 		cnt = 0;
 		cp = map;
 		while (cp < endp) {
@@ -61,10 +61,9 @@ static void prepare_order(const char *orderfile)
 
 static int match_order(const char *path)
 {
-	int i;
 	static struct strbuf p = STRBUF_INIT;
 
-	for (i = 0; i < order_cnt; i++) {
+	for (int i = 0; i < order_cnt; i++) {
 		strbuf_reset(&p);
 		strbuf_addstr(&p, path);
 		while (p.buf[0]) {
@@ -93,13 +92,11 @@ static int compare_objs_order(const void *a_, const void *b_)
 void order_objects(const char *orderfile, obj_path_fn_t obj_path,
 		   struct obj_order *objs, int nr)
 {
-	int i;
-
 	if (!nr)
 		return;
 
 	prepare_order(orderfile);
-	for (i = 0; i < nr; i++) {
+	for (int i = 0; i < nr; i++) {
 		objs[i].orig_order = i;
 		objs[i].order = match_order(obj_path(objs[i].obj));
 	}
diff --git a/diffcore-rename.c b/diffcore-rename.c
index 5a6e2bcac7..8082955c6e 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -576,7 +576,6 @@ static void initialize_dir_rename_info(struct dir_rename_info *info,
 {
 	struct hashmap_iter iter;
 	struct strmap_entry *entry;
-	int i;
 
 	if (!dirs_removed && !relevant_sources) {
 		info->setup = 0;
@@ -613,7 +612,7 @@ static void initialize_dir_rename_info(struct dir_rename_info *info,
 	 * Loop setting up both info->idx_map, and doing setup of
 	 * info->dir_rename_count.
 	 */
-	for (i = 0; i < rename_dst_nr; ++i) {
+	for (int i = 0; i < rename_dst_nr; ++i) {
 		/*
 		 * For non-renamed files, make idx_map contain mapping of
 		 *   filename -> index (index within rename_dst, that is)
@@ -685,7 +684,6 @@ static void cleanup_dir_rename_info(struct dir_rename_info *info,
 	struct hashmap_iter iter;
 	struct strmap_entry *entry;
 	struct string_list to_remove = STRING_LIST_INIT_NODUP;
-	int i;
 
 	if (!info->setup)
 		return;
@@ -731,7 +729,7 @@ static void cleanup_dir_rename_info(struct dir_rename_info *info,
 		if (strintmap_contains(counts, UNKNOWN_DIR))
 			strintmap_remove(counts, UNKNOWN_DIR);
 	}
-	for (i = 0; i < to_remove.nr; ++i)
+	for (int i = 0; i < to_remove.nr; ++i)
 		strmap_remove(info->dir_rename_count,
 			      to_remove.items[i].string, 1);
 	string_list_clear(&to_remove, 0);
@@ -840,7 +838,6 @@ static void basename_prefetch(void *prefetch_options)
 	struct strintmap *sources = options->sources;
 	struct strintmap *dests = options->dests;
 	struct dir_rename_info *info = options->info;
-	int i;
 	struct oid_array to_fetch = OID_ARRAY_INIT;
 
 	/*
@@ -848,7 +845,7 @@ static void basename_prefetch(void *prefetch_options)
 	 * find_basename_matches(), though not quite exactly.  Maybe
 	 * abstract the iteration logic out somehow?
 	 */
-	for (i = 0; i < rename_src_nr; ++i) {
+	for (int i = 0; i < rename_src_nr; ++i) {
 		char *filename = rename_src[i].p->one->path;
 		const char *base = NULL;
 		intptr_t src_index;
@@ -1062,11 +1059,11 @@ static int find_basename_matches(struct diff_options *options,
 #define NUM_CANDIDATE_PER_DST 4
 static void record_if_better(struct diff_score m[], struct diff_score *o)
 {
-	int i, worst;
+	int worst;
 
 	/* find the worst one */
 	worst = 0;
-	for (i = 1; i < NUM_CANDIDATE_PER_DST; i++)
+	for (int i = 1; i < NUM_CANDIDATE_PER_DST; i++)
 		if (score_compare(&m[i], &m[worst]) > 0)
 			worst = i;
 
@@ -1132,9 +1129,9 @@ static int find_renames(struct diff_score *mx,
 			struct dir_rename_info *info,
 			struct strintmap *dirs_removed)
 {
-	int count = 0, i;
+	int count = 0;
 
-	for (i = 0; i < dst_cnt * NUM_CANDIDATE_PER_DST; i++) {
+	for (int i = 0; i < dst_cnt * NUM_CANDIDATE_PER_DST; i++) {
 		struct diff_rename_dst *dst;
 
 		if ((mx[i].dst < 0) ||
diff --git a/dir.c b/dir.c
index ac69954230..a2199be105 100644
--- a/dir.c
+++ b/dir.c
@@ -163,7 +163,6 @@ static int fnmatch_icase_mem(const char *pattern, int patternlen,
 
 static size_t common_prefix_len(const struct pathspec *pathspec)
 {
-	int n;
 	size_t max = 0;
 
 	/*
@@ -182,7 +181,7 @@ static size_t common_prefix_len(const struct pathspec *pathspec)
 		       PATHSPEC_EXCLUDE |
 		       PATHSPEC_ATTR);
 
-	for (n = 0; n < pathspec->nr; n++) {
+	for (int n = 0; n < pathspec->nr; n++) {
 		size_t i = 0, len = 0, item_len;
 		if (pathspec->items[n].magic & PATHSPEC_EXCLUDE)
 			continue;
@@ -462,7 +461,7 @@ static int do_match_pathspec(struct index_state *istate,
 			     int prefix, char *seen,
 			     unsigned flags)
 {
-	int i, retval = 0, exclude = flags & DO_MATCH_EXCLUDE;
+	int retval = 0, exclude = flags & DO_MATCH_EXCLUDE;
 
 	GUARD_PATHSPEC(ps,
 		       PATHSPEC_FROMTOP |
@@ -488,7 +487,7 @@ static int do_match_pathspec(struct index_state *istate,
 	name += prefix;
 	namelen -= prefix;
 
-	for (i = ps->nr - 1; i >= 0; i--) {
+	for (int i = ps->nr - 1; i >= 0; i--) {
 		int how;
 
 		if ((!exclude &&   ps->items[i].magic & PATHSPEC_EXCLUDE) ||
@@ -575,8 +574,8 @@ int report_path_error(const char *ps_matched,
 	/*
 	 * Make sure all pathspec matched; otherwise it is an error.
 	 */
-	int num, errors = 0;
-	for (num = 0; num < pathspec->nr; num++) {
+	int errors = 0;
+	for (int num = 0; num < pathspec->nr; num++) {
 		int other, found_dup;
 
 		if (ps_matched[num])
@@ -938,9 +937,7 @@ static int read_skip_worktree_file_from_index(struct index_state *istate,
  */
 void clear_pattern_list(struct pattern_list *pl)
 {
-	int i;
-
-	for (i = 0; i < pl->nr; i++)
+	for (int i = 0; i < pl->nr; i++)
 		free(pl->patterns[i]);
 	free(pl->patterns);
 	free(pl->filebuf);
@@ -952,9 +949,9 @@ void clear_pattern_list(struct pattern_list *pl)
 
 static void trim_trailing_spaces(char *buf)
 {
-	char *p, *last_space = NULL;
+	char *last_space = NULL;
 
-	for (p = buf; *p; p++)
+	for (char *p = buf; *p; p++)
 		switch (*p) {
 		case ' ':
 			if (!last_space)
@@ -1020,10 +1017,9 @@ static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
 
 static void do_invalidate_gitignore(struct untracked_cache_dir *dir)
 {
-	int i;
 	dir->valid = 0;
 	dir->untracked_nr = 0;
-	for (i = 0; i < dir->dirs_nr; i++)
+	for (int i = 0; i < dir->dirs_nr; i++)
 		do_invalidate_gitignore(dir->dirs[i]);
 }
 
@@ -1037,8 +1033,6 @@ static void invalidate_gitignore(struct untracked_cache *uc,
 static void invalidate_directory(struct untracked_cache *uc,
 				 struct untracked_cache_dir *dir)
 {
-	int i;
-
 	/*
 	 * Invalidation increment here is just roughly correct. If
 	 * untracked_nr or any of dirs[].recurse is non-zero, we
@@ -1050,7 +1044,7 @@ static void invalidate_directory(struct untracked_cache *uc,
 
 	dir->valid = 0;
 	dir->untracked_nr = 0;
-	for (i = 0; i < dir->dirs_nr; i++)
+	for (int i = 0; i < dir->dirs_nr; i++)
 		dir->dirs[i]->recurse = 0;
 }
 
@@ -1144,7 +1138,7 @@ static int add_patterns_from_buffer(char *buf, size_t size,
 				    const char *base, int baselen,
 				    struct pattern_list *pl)
 {
-	int i, lineno = 1;
+	int lineno = 1;
 	char *entry;
 
 	hashmap_init(&pl->recursive_hashmap, pl_hashmap_cmp, NULL, 0);
@@ -1157,7 +1151,7 @@ static int add_patterns_from_buffer(char *buf, size_t size,
 
 	entry = buf;
 
-	for (i = 0; i < size; i++) {
+	for (int i = 0; i < size; i++) {
 		if (buf[i] == '\n') {
 			if (entry != buf + i && entry[0] != '#') {
 				buf[i - (i && buf[i-1] == '\r')] = 0;
@@ -1331,12 +1325,11 @@ static struct path_pattern *last_matching_pattern_from_list(const char *pathname
 						       struct index_state *istate)
 {
 	struct path_pattern *res = NULL; /* undecided */
-	int i;
 
 	if (!pl->nr)
 		return NULL;	/* undefined */
 
-	for (i = pl->nr - 1; 0 <= i; i--) {
+	for (int i = pl->nr - 1; 0 <= i; i--) {
 		struct path_pattern *pattern = pl->patterns[i];
 		const char *exclude = pattern->pattern;
 		int prefix = pattern->nowildcardlen;
@@ -1475,7 +1468,7 @@ static int path_in_sparse_checkout_1(const char *path,
 {
 	int dtype = DT_REG;
 	enum pattern_match_result match = UNDECIDED;
-	const char *end, *slash;
+	const char *slash;
 
 	/*
 	 * We default to accepting a path if the path is empty, there are no
@@ -1493,9 +1486,7 @@ static int path_in_sparse_checkout_1(const char *path,
 	 * never returns UNDECIDED, so we will execute only one iteration in
 	 * this case.
 	 */
-	for (end = path + strlen(path);
-	     end > path && match == UNDECIDED;
-	     end = slash) {
+	for (const char *end = path + strlen(path); end > path && match == UNDECIDED; end = slash) {
 
 		for (slash = end - 1; slash > path && *slash != '/'; slash--)
 			; /* do nothing */
@@ -1527,10 +1518,10 @@ static struct path_pattern *last_matching_pattern_from_lists(
 		const char *pathname, int pathlen,
 		const char *basename, int *dtype_p)
 {
-	int i, j;
+	int j;
 	struct exclude_list_group *group;
 	struct path_pattern *pattern;
-	for (i = EXC_CMDL; i <= EXC_FILE; i++) {
+	for (int i = EXC_CMDL; i <= EXC_FILE; i++) {
 		group = &dir->internal.exclude_list_group[i];
 		for (j = group->nr - 1; j >= 0; j--) {
 			pattern = last_matching_pattern_from_list(
@@ -2101,8 +2092,7 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
 	 */
 	if ((dir->flags & DIR_SHOW_IGNORED_TOO) &&
 	    !(dir->flags & DIR_KEEP_UNTRACKED_CONTENTS)) {
-		int i;
-		for (i = old_untracked_nr + 1; i<dir->nr; ++i)
+		for (int i = old_untracked_nr + 1; i < dir->nr; ++i)
 			FREE_AND_NULL(dir->entries[i]);
 		dir->nr = old_untracked_nr;
 	}
@@ -2126,8 +2116,6 @@ static enum path_treatment treat_directory(struct dir_struct *dir,
 static int simplify_away(const char *path, int pathlen,
 			 const struct pathspec *pathspec)
 {
-	int i;
-
 	if (!pathspec || !pathspec->nr)
 		return 0;
 
@@ -2140,7 +2128,7 @@ static int simplify_away(const char *path, int pathlen,
 		       PATHSPEC_EXCLUDE |
 		       PATHSPEC_ATTR);
 
-	for (i = 0; i < pathspec->nr; i++) {
+	for (int i = 0; i < pathspec->nr; i++) {
 		const struct pathspec_item *item = &pathspec->items[i];
 		int len = item->nowildcard_len;
 
@@ -2167,8 +2155,6 @@ static int simplify_away(const char *path, int pathlen,
 static int exclude_matches_pathspec(const char *path, int pathlen,
 				    const struct pathspec *pathspec)
 {
-	int i;
-
 	if (!pathspec || !pathspec->nr)
 		return 0;
 
@@ -2181,7 +2167,7 @@ static int exclude_matches_pathspec(const char *path, int pathlen,
 		       PATHSPEC_EXCLUDE |
 		       PATHSPEC_ATTR);
 
-	for (i = 0; i < pathspec->nr; i++) {
+	for (int i = 0; i < pathspec->nr; i++) {
 		const struct pathspec_item *item = &pathspec->items[i];
 		int len = item->nowildcard_len;
 
@@ -3933,7 +3919,6 @@ void untracked_cache_add_to_index(struct index_state *istate,
 static void connect_wt_gitdir_in_nested(const char *sub_worktree,
 					const char *sub_gitdir)
 {
-	int i;
 	struct repository subrepo;
 	struct strbuf sub_wt = STRBUF_INIT;
 	struct strbuf sub_gd = STRBUF_INIT;
@@ -3949,7 +3934,7 @@ static void connect_wt_gitdir_in_nested(const char *sub_worktree,
 
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(subrepo.index);
-	for (i = 0; i < subrepo.index->cache_nr; i++) {
+	for (int i = 0; i < subrepo.index->cache_nr; i++) {
 		const struct cache_entry *ce = subrepo.index->cache[i];
 
 		if (!S_ISGITLINK(ce->ce_mode))
diff --git a/entry.c b/entry.c
index f918a3a78e..22b8cf69ca 100644
--- a/entry.c
+++ b/entry.c
@@ -431,7 +431,7 @@ static int check_path(const char *path, int len, struct stat *st, int skiplen)
 static void mark_colliding_entries(const struct checkout *state,
 				   struct cache_entry *ce, struct stat *st)
 {
-	int i, trust_ino = check_stat;
+	int trust_ino = check_stat;
 
 #if defined(GIT_WINDOWS_NATIVE) || defined(__CYGWIN__)
 	trust_ino = 0;
@@ -441,7 +441,7 @@ static void mark_colliding_entries(const struct checkout *state,
 
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(state->istate);
-	for (i = 0; i < state->istate->cache_nr; i++) {
+	for (int i = 0; i < state->istate->cache_nr; i++) {
 		struct cache_entry *dup = state->istate->cache[i];
 
 		if (dup == ce) {
diff --git a/environment.c b/environment.c
index 90632a39bc..080dc2a661 100644
--- a/environment.c
+++ b/environment.c
@@ -146,7 +146,7 @@ const char * const local_repo_env[] = {
 static char *expand_namespace(const char *raw_namespace)
 {
 	struct strbuf buf = STRBUF_INIT;
-	struct strbuf **components, **c;
+	struct strbuf **components;
 
 	if (!raw_namespace || !*raw_namespace)
 		return xstrdup("");
@@ -154,7 +154,7 @@ static char *expand_namespace(const char *raw_namespace)
 	strbuf_addstr(&buf, raw_namespace);
 	components = strbuf_split(&buf, '/');
 	strbuf_reset(&buf);
-	for (c = components; *c; c++)
+	for (struct strbuf **c = components; *c; c++)
 		if (strcmp((*c)->buf, "/") != 0)
 			strbuf_addf(&buf, "refs/namespaces/%s", (*c)->buf);
 	strbuf_list_free(components);
diff --git a/ewah/bitmap.c b/ewah/bitmap.c
index ac7e0af622..e6bc290e24 100644
--- a/ewah/bitmap.c
+++ b/ewah/bitmap.c
@@ -76,10 +76,10 @@ int bitmap_get(struct bitmap *self, size_t pos)
 struct ewah_bitmap *bitmap_to_ewah(struct bitmap *bitmap)
 {
 	struct ewah_bitmap *ewah = ewah_new();
-	size_t i, running_empty_words = 0;
+	size_t running_empty_words = 0;
 	eword_t last_word = 0;
 
-	for (i = 0; i < bitmap->word_alloc; ++i) {
+	for (size_t i = 0; i < bitmap->word_alloc; ++i) {
 		if (bitmap->words[i] == 0) {
 			running_empty_words++;
 			continue;
@@ -121,20 +121,14 @@ struct bitmap *ewah_to_bitmap(struct ewah_bitmap *ewah)
 void bitmap_and_not(struct bitmap *self, struct bitmap *other)
 {
 	const size_t count = (self->word_alloc < other->word_alloc) ?
-		self->word_alloc : other->word_alloc;
-
-	size_t i;
-
-	for (i = 0; i < count; ++i)
+		self->word_alloc : other->word_alloc;for (size_t i = 0; i < count; ++i)
 		self->words[i] &= ~other->words[i];
 }
 
 void bitmap_or(struct bitmap *self, const struct bitmap *other)
 {
-	size_t i;
-
 	bitmap_grow(self, other->word_alloc);
-	for (i = 0; i < other->word_alloc; i++)
+	for (size_t i = 0; i < other->word_alloc; i++)
 		self->words[i] |= other->words[i];
 }
 
@@ -161,9 +155,9 @@ void bitmap_or_ewah(struct bitmap *self, struct ewah_bitmap *other)
 
 size_t bitmap_popcount(struct bitmap *self)
 {
-	size_t i, count = 0;
+	size_t count = 0;
 
-	for (i = 0; i < self->word_alloc; ++i)
+	for (size_t i = 0; i < self->word_alloc; ++i)
 		count += ewah_bit_popcount64(self->words[i]);
 
 	return count;
@@ -171,8 +165,7 @@ size_t bitmap_popcount(struct bitmap *self)
 
 int bitmap_is_empty(struct bitmap *self)
 {
-	size_t i;
-	for (i = 0; i < self->word_alloc; i++)
+	for (size_t i = 0; i < self->word_alloc; i++)
 		if (self->words[i])
 			return 0;
 	return 1;
diff --git a/ewah/ewah_io.c b/ewah/ewah_io.c
index 9035ee65ea..1a4f8f9557 100644
--- a/ewah/ewah_io.c
+++ b/ewah/ewah_io.c
@@ -90,7 +90,6 @@ ssize_t ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len)
 {
 	const uint8_t *ptr = map;
 	size_t data_len;
-	size_t i;
 
 	if (len < sizeof(uint32_t))
 		return error("corrupt ewah bitmap: eof before bit size");
@@ -121,7 +120,7 @@ ssize_t ewah_read_mmap(struct ewah_bitmap *self, const void *map, size_t len)
 	ptr += data_len;
 	len -= data_len;
 
-	for (i = 0; i < self->buffer_size; ++i)
+	for (size_t i = 0; i < self->buffer_size; ++i)
 		self->buffer[i] = ntohll(self->buffer[i]);
 
 	if (len < sizeof(uint32_t))
diff --git a/fetch-pack.c b/fetch-pack.c
index 091f9a80a9..176944aeb4 100644
--- a/fetch-pack.c
+++ b/fetch-pack.c
@@ -109,14 +109,13 @@ static void for_each_cached_alternate(struct fetch_negotiator *negotiator,
 {
 	static int initialized;
 	static struct alternate_object_cache cache;
-	size_t i;
 
 	if (!initialized) {
 		for_each_alternate_ref(cache_one_alternate, &cache);
 		initialized = 1;
 	}
 
-	for (i = 0; i < cache.nr; i++)
+	for (size_t i = 0; i < cache.nr; i++)
 		cb(negotiator, cache.items[i]);
 }
 
@@ -287,14 +286,12 @@ static int next_flush(int stateless_rpc, int count)
 static void mark_tips(struct fetch_negotiator *negotiator,
 		      const struct oid_array *negotiation_tips)
 {
-	int i;
-
 	if (!negotiation_tips) {
 		for_each_rawref(rev_list_insert_ref_oid, negotiator);
 		return;
 	}
 
-	for (i = 0; i < negotiation_tips->nr; i++)
+	for (int i = 0; i < negotiation_tips->nr; i++)
 		rev_list_insert_ref(negotiator, &negotiation_tips->oid[i]);
 	return;
 }
@@ -414,8 +411,7 @@ static int find_common(struct fetch_negotiator *negotiator,
 		packet_buf_write(&req_buf, "deepen-since %"PRItime, max_age);
 	}
 	if (args->deepen_not) {
-		int i;
-		for (i = 0; i < args->deepen_not->nr; i++) {
+		for (int i = 0; i < args->deepen_not->nr; i++) {
 			struct string_list_item *s = args->deepen_not->items + i;
 			packet_buf_write(&req_buf, "deepen-not %s", s->string);
 		}
@@ -1023,9 +1019,7 @@ static int get_pack(struct fetch_pack_args *args,
 	}
 
 	if (index_pack_args) {
-		int i;
-
-		for (i = 0; i < cmd.args.nr; i++)
+		for (int i = 0; i < cmd.args.nr; i++)
 			strvec_push(index_pack_args, cmd.args.v[i]);
 	}
 
@@ -1246,8 +1240,7 @@ static void add_shallow_requests(struct strbuf *req_buf,
 		packet_buf_write(req_buf, "deepen-since %"PRItime, max_age);
 	}
 	if (args->deepen_not) {
-		int i;
-		for (i = 0; i < args->deepen_not->nr; i++) {
+		for (int i = 0; i < args->deepen_not->nr; i++) {
 			struct string_list_item *s = args->deepen_not->items + i;
 			packet_buf_write(req_buf, "deepen-not %s", s->string);
 		}
@@ -1328,9 +1321,8 @@ static void write_fetch_command_and_capabilities(struct strbuf *req_buf,
 	if (advertise_sid && server_supports_v2("session-id"))
 		packet_buf_write(req_buf, "session-id=%s", trace2_session_id());
 	if (server_options && server_options->nr) {
-		int i;
 		ensure_server_supports_v2("server-option");
-		for (i = 0; i < server_options->nr; i++)
+		for (int i = 0; i < server_options->nr; i++)
 			packet_buf_write(req_buf, "server-option=%s",
 					 server_options->items[i].string);
 	}
@@ -1382,10 +1374,9 @@ static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out,
 		    server_supports_feature("fetch", "filter", 0));
 
 	if (server_supports_feature("fetch", "packfile-uris", 0)) {
-		int i;
 		struct strbuf to_send = STRBUF_INIT;
 
-		for (i = 0; i < uri_protocols.nr; i++) {
+		for (int i = 0; i < uri_protocols.nr; i++) {
 			const char *s = uri_protocols.items[i].string;
 
 			if (!strcmp(s, "https") || !strcmp(s, "http")) {
@@ -1549,15 +1540,7 @@ static void receive_shallow_info(struct fetch_pack_args *args,
 	    reader->status != PACKET_READ_DELIM)
 		die(_("error processing shallow info: %d"), reader->status);
 
-	if (args->deepen || unshallow_received) {
-		/*
-		 * Treat these as shallow lines caused by our depth settings.
-		 * In v0, these lines cannot cause refs to be rejected; do the
-		 * same.
-		 */
-		int i;
-
-		for (i = 0; i < shallows->nr; i++)
+	if (args->deepen || unshallow_received) {for (int i = 0; i < shallows->nr; i++)
 			register_shallow(the_repository, &shallows->oid[i]);
 		setup_alternate_shallow(&shallow_lock, &alternate_shallow_file,
 					NULL);
@@ -1661,7 +1644,6 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 	struct object_id common_oid;
 	int received_ready = 0;
 	struct string_list packfile_uris = STRING_LIST_INIT_DUP;
-	int i;
 	struct strvec index_pack_args = STRVEC_INIT;
 
 	negotiator = &negotiator_alloc;
@@ -1794,7 +1776,7 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
 		}
 	}
 
-	for (i = 0; i < packfile_uris.nr; i++) {
+	for (int i = 0; i < packfile_uris.nr; i++) {
 		int j;
 		struct child_process cmd = CHILD_PROCESS_INIT;
 		char packname[GIT_MAX_HEXSZ + 1];
@@ -2225,9 +2207,9 @@ void negotiate_using_fetch(const struct oid_array *negotiation_tips,
 
 int report_unmatched_refs(struct ref **sought, int nr_sought)
 {
-	int i, ret = 0;
+	int ret = 0;
 
-	for (i = 0; i < nr_sought; i++) {
+	for (int i = 0; i < nr_sought; i++) {
 		if (!sought[i])
 			continue;
 		switch (sought[i]->match_status) {
diff --git a/fmt-merge-msg.c b/fmt-merge-msg.c
index 66e47449a0..3872ba5de3 100644
--- a/fmt-merge-msg.c
+++ b/fmt-merge-msg.c
@@ -85,8 +85,7 @@ static struct merge_parent *find_merge_parent(struct merge_parents *table,
 					      struct object_id *given,
 					      struct object_id *commit)
 {
-	int i;
-	for (i = 0; i < table->nr; i++) {
+	for (int i = 0; i < table->nr; i++) {
 		if (given && !oideq(&table->item[i].given, given))
 			continue;
 		if (commit && !oideq(&table->item[i].commit, commit))
@@ -209,9 +208,8 @@ static void print_joined(const char *singular, const char *plural,
 	if (list->nr == 1) {
 		strbuf_addf(out, "%s%s", singular, list->items[0].string);
 	} else {
-		int i;
 		strbuf_addstr(out, plural);
-		for (i = 0; i < list->nr - 1; i++)
+		for (int i = 0; i < list->nr - 1; i++)
 			strbuf_addf(out, "%s%s", i > 0 ? ", " : "",
 				    list->items[i].string);
 		strbuf_addf(out, " and %s", list->items[list->nr - 1].string);
@@ -345,7 +343,7 @@ static void shortlog(const char *name,
 		     struct fmt_merge_msg_opts *opts,
 		     struct strbuf *out)
 {
-	int i, count = 0;
+	int count = 0;
 	struct commit *commit;
 	struct object *branch;
 	struct string_list subjects = STRING_LIST_INIT_DUP;
@@ -408,7 +406,7 @@ static void shortlog(const char *name,
 	if (origin_data->is_local_branch && use_branch_desc)
 		add_branch_desc(out, name);
 
-	for (i = 0; i < subjects.nr; i++)
+	for (int i = 0; i < subjects.nr; i++)
 		if (i >= limit)
 			strbuf_addstr(out, "  ...\n");
 		else
@@ -516,10 +514,10 @@ static void fmt_tag_signature(struct strbuf *tagbuf,
 
 static void fmt_merge_msg_sigs(struct strbuf *out)
 {
-	int i, tag_number = 0, first_tag = 0;
+	int tag_number = 0, first_tag = 0;
 	struct strbuf tagbuf = STRBUF_INIT;
 
-	for (i = 0; i < origins.nr; i++) {
+	for (int i = 0; i < origins.nr; i++) {
 		struct object_id *oid = origins.items[i].util;
 		enum object_type type;
 		unsigned long size;
diff --git a/fsck.c b/fsck.c
index 8ded0a473a..f9697ca33b 100644
--- a/fsck.c
+++ b/fsck.c
@@ -40,13 +40,11 @@ static struct {
 
 static void prepare_msg_ids(void)
 {
-	int i;
-
 	if (msg_id_info[0].downcased)
 		return;
 
 	/* convert id_string to lower case, without underscores. */
-	for (i = 0; i < FSCK_MSG_MAX; i++) {
+	for (int i = 0; i < FSCK_MSG_MAX; i++) {
 		const char *p = msg_id_info[i].id_string;
 		int len = strlen(p);
 		char *q = xmalloc(len);
@@ -77,11 +75,9 @@ static void prepare_msg_ids(void)
 
 static int parse_msg_id(const char *text)
 {
-	int i;
-
 	prepare_msg_ids();
 
-	for (i = 0; i < FSCK_MSG_MAX; i++)
+	for (int i = 0; i < FSCK_MSG_MAX; i++)
 		if (!strcmp(text, msg_id_info[i].downcased))
 			return i;
 
@@ -90,11 +86,9 @@ static int parse_msg_id(const char *text)
 
 void list_config_fsck_msg_ids(struct string_list *list, const char *prefix)
 {
-	int i;
-
 	prepare_msg_ids();
 
-	for (i = 0; i < FSCK_MSG_MAX; i++)
+	for (int i = 0; i < FSCK_MSG_MAX; i++)
 		list_config_item(list, prefix, msg_id_info[i].camelcased);
 }
 
@@ -139,10 +133,9 @@ void fsck_set_msg_type_from_ids(struct fsck_options *options,
 				enum fsck_msg_type msg_type)
 {
 	if (!options->msg_type) {
-		int i;
 		enum fsck_msg_type *severity;
 		ALLOC_ARRAY(severity, FSCK_MSG_MAX);
-		for (i = 0; i < FSCK_MSG_MAX; i++)
+		for (int i = 0; i < FSCK_MSG_MAX; i++)
 			severity[i] = fsck_msg_type(i, options);
 		options->msg_type = severity;
 	}
@@ -794,9 +787,7 @@ static int verify_headers(const void *data, unsigned long size,
 			  struct fsck_options *options)
 {
 	const char *buffer = (const char *)data;
-	unsigned long i;
-
-	for (i = 0; i < size; i++) {
+	for (unsigned long i = 0; i < size; i++) {
 		switch (buffer[i]) {
 		case '\0':
 			return report(options, oid, type,
diff --git a/fsmonitor.c b/fsmonitor.c
index f670c50937..7b491327c8 100644
--- a/fsmonitor.c
+++ b/fsmonitor.c
@@ -103,9 +103,9 @@ int read_fsmonitor_extension(struct index_state *istate, const void *data,
 
 void fill_fsmonitor_bitmap(struct index_state *istate)
 {
-	unsigned int i, skipped = 0;
+	unsigned int skipped = 0;
 	istate->fsmonitor_dirty = ewah_new();
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (unsigned int i = 0; i < istate->cache_nr; i++) {
 		if (istate->cache[i]->ce_flags & CE_REMOVE)
 			skipped++;
 		else if (!(istate->cache[i]->ce_flags & CE_FSMONITOR_VALID))
@@ -304,7 +304,6 @@ void refresh_fsmonitor(struct index_state *istate)
 	uint64_t last_update;
 	struct strbuf last_update_token = STRBUF_INIT;
 	char *buf;
-	unsigned int i;
 	int is_trivial = 0;
 	struct repository *r = istate->repo;
 	enum fsmonitor_mode fsm_mode = fsm_settings__get_mode(r);
@@ -458,7 +457,7 @@ void refresh_fsmonitor(struct index_state *istate)
 		int count = 0;
 
 		buf = query_result.buf;
-		for (i = bol; i < query_result.len; i++) {
+		for (unsigned int i = bol; i < query_result.len; i++) {
 			if (buf[i] != '\0')
 				continue;
 			fsmonitor_refresh_callback(istate, buf + bol);
@@ -491,7 +490,7 @@ void refresh_fsmonitor(struct index_state *istate)
 		 */
 		int is_cache_changed = 0;
 
-		for (i = 0; i < istate->cache_nr; i++) {
+		for (unsigned int i = 0; i < istate->cache_nr; i++) {
 			if (istate->cache[i]->ce_flags & CE_FSMONITOR_VALID) {
 				is_cache_changed = 1;
 				istate->cache[i]->ce_flags &= ~CE_FSMONITOR_VALID;
diff --git a/git.c b/git.c
index fd9b0e6a9e..3545427905 100644
--- a/git.c
+++ b/git.c
@@ -72,7 +72,6 @@ static int match_token(const char *spec, int len, const char *token)
 static int list_cmds(const char *spec)
 {
 	struct string_list list = STRING_LIST_INIT_DUP;
-	int i;
 	int nongit;
 
 	/*
@@ -110,7 +109,7 @@ static int list_cmds(const char *spec)
 		if (*spec == ',')
 			spec++;
 	}
-	for (i = 0; i < list.nr; i++)
+	for (int i = 0; i < list.nr; i++)
 		puts(list.items[i].string);
 	string_list_clear(&list, 0);
 	return 0;
@@ -640,8 +639,7 @@ static struct cmd_struct commands[] = {
 
 static struct cmd_struct *get_builtin(const char *s)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(commands); i++) {
+	for (int i = 0; i < ARRAY_SIZE(commands); i++) {
 		struct cmd_struct *p = commands + i;
 		if (!strcmp(s, p->cmd))
 			return p;
@@ -656,8 +654,7 @@ int is_builtin(const char *s)
 
 static void list_builtins(struct string_list *out, unsigned int exclude_option)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(commands); i++) {
+	for (int i = 0; i < ARRAY_SIZE(commands); i++) {
 		if (exclude_option &&
 		    (commands[i].option & exclude_option))
 			continue;
@@ -668,7 +665,6 @@ static void list_builtins(struct string_list *out, unsigned int exclude_option)
 void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
 {
 	const char *name;
-	int i;
 
 	/*
 	 * Callers can ask for a subset of the commands based on a certain
@@ -679,7 +675,7 @@ void load_builtin_commands(const char *prefix, struct cmdnames *cmds)
 	if (!skip_prefix(prefix, "git-", &prefix))
 		BUG("prefix '%s' must start with 'git-'", prefix);
 
-	for (i = 0; i < ARRAY_SIZE(commands); i++)
+	for (int i = 0; i < ARRAY_SIZE(commands); i++)
 		if (skip_prefix(commands[i].cmd, prefix, &name))
 			add_cmdname(cmds, name, strlen(name));
 }
@@ -707,12 +703,10 @@ static void handle_builtin(int argc, const char **argv)
 
 	/* Turn "git cmd --help" into "git help --exclude-guides cmd" */
 	if (argc > 1 && !strcmp(argv[1], "--help")) {
-		int i;
-
 		argv[1] = argv[0];
 		argv[0] = cmd = "help";
 
-		for (i = 0; i < argc; i++) {
+		for (int i = 0; i < argc; i++) {
 			strvec_push(&args, argv[i]);
 			if (!i)
 				strvec_push(&args, "--exclude-guides");
diff --git a/gpg-interface.c b/gpg-interface.c
index 95e764acb1..cd3dd5b5b4 100644
--- a/gpg-interface.c
+++ b/gpg-interface.c
@@ -123,9 +123,7 @@ static struct gpg_format *use_format = &gpg_format[0];
 
 static struct gpg_format *get_format_by_name(const char *str)
 {
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(gpg_format); i++)
+	for (int i = 0; i < ARRAY_SIZE(gpg_format); i++)
 		if (!strcmp(gpg_format[i].name, str))
 			return gpg_format + i;
 	return NULL;
@@ -133,9 +131,9 @@ static struct gpg_format *get_format_by_name(const char *str)
 
 static struct gpg_format *get_format_by_sig(const char *sig)
 {
-	int i, j;
+	int j;
 
-	for (i = 0; i < ARRAY_SIZE(gpg_format); i++)
+	for (int i = 0; i < ARRAY_SIZE(gpg_format); i++)
 		for (j = 0; gpg_format[i].sigs[j]; j++)
 			if (starts_with(sig, gpg_format[i].sigs[j]))
 				return gpg_format + i;
@@ -208,9 +206,7 @@ static void replace_cstring(char **field, const char *line, const char *next)
 static int parse_gpg_trust_level(const char *level,
 				 enum signature_trust_level *res)
 {
-	size_t i;
-
-	for (i = 0; i < ARRAY_SIZE(sigcheck_gpg_trust_level); i++) {
+	for (size_t i = 0; i < ARRAY_SIZE(sigcheck_gpg_trust_level); i++) {
 		if (!strcmp(sigcheck_gpg_trust_level[i].key, level)) {
 			*res = sigcheck_gpg_trust_level[i].value;
 			return 0;
@@ -222,12 +218,12 @@ static int parse_gpg_trust_level(const char *level,
 static void parse_gpg_output(struct signature_check *sigc)
 {
 	const char *buf = sigc->gpg_status;
-	const char *line, *next;
+	const char *next;
 	int i, j;
 	int seen_exclusive_status = 0;
 
 	/* Iterate over all lines */
-	for (line = buf; *line; line = strchrnul(line+1, '\n')) {
+	for (const char *line = buf; *line; line = strchrnul(line + 1, '\n')) {
 		while (*line == '\n')
 			line++;
 		if (!*line)
@@ -952,9 +948,9 @@ int sign_buffer(struct strbuf *buffer, struct strbuf *signature, const char *sig
  */
 static void remove_cr_after(struct strbuf *buffer, size_t offset)
 {
-	size_t i, j;
+	size_t j;
 
-	for (i = j = offset; i < buffer->len; i++) {
+	for (size_t i = j = offset; i < buffer->len; i++) {
 		if (buffer->buf[i] != '\r') {
 			if (i != j)
 				buffer->buf[j] = buffer->buf[i];
diff --git a/graph.c b/graph.c
index 1ca34770ee..a22172b677 100644
--- a/graph.c
+++ b/graph.c
@@ -460,8 +460,6 @@ static int graph_is_interesting(struct git_graph *graph, struct commit *commit)
 static struct commit_list *next_interesting_parent(struct git_graph *graph,
 						   struct commit_list *orig)
 {
-	struct commit_list *list;
-
 	/*
 	 * If revs->first_parent_only is set, only the first
 	 * parent is interesting.  None of the others are.
@@ -472,7 +470,7 @@ static struct commit_list *next_interesting_parent(struct git_graph *graph,
 	/*
 	 * Return the next interesting commit after orig
 	 */
-	for (list = orig->next; list; list = list->next) {
+	for (struct commit_list *list = orig->next; list; list = list->next) {
 		if (graph_is_interesting(graph, list->item))
 			return list;
 	}
@@ -522,8 +520,7 @@ static void graph_increment_column_color(struct git_graph *graph)
 static unsigned short graph_find_commit_color(const struct git_graph *graph,
 					      const struct commit *commit)
 {
-	int i;
-	for (i = 0; i < graph->num_columns; i++) {
+	for (int i = 0; i < graph->num_columns; i++) {
 		if (graph->columns[i].commit == commit)
 			return graph->columns[i].color;
 	}
@@ -533,8 +530,7 @@ static unsigned short graph_find_commit_color(const struct git_graph *graph,
 static int graph_find_new_column_by_commit(struct git_graph *graph,
 					   struct commit *commit)
 {
-	int i;
-	for (i = 0; i < graph->num_new_columns; i++) {
+	for (int i = 0; i < graph->num_new_columns; i++) {
 		if (graph->new_columns[i].commit == commit)
 			return i;
 	}
@@ -736,8 +732,6 @@ static int graph_needs_pre_commit_line(struct git_graph *graph)
 
 void graph_update(struct git_graph *graph, struct commit *commit)
 {
-	struct commit_list *parent;
-
 	/*
 	 * Set the new commit
 	 */
@@ -747,9 +741,7 @@ void graph_update(struct git_graph *graph, struct commit *commit)
 	 * Count how many interesting parents this commit has
 	 */
 	graph->num_parents = 0;
-	for (parent = first_interesting_parent(graph);
-	     parent;
-	     parent = next_interesting_parent(graph, parent))
+	for (struct commit_list *parent = first_interesting_parent(graph); parent; parent = next_interesting_parent(graph, parent))
 	{
 		graph->num_parents++;
 	}
@@ -797,15 +789,7 @@ void graph_update(struct git_graph *graph, struct commit *commit)
 
 static int graph_is_mapping_correct(struct git_graph *graph)
 {
-	int i;
-
-	/*
-	 * The mapping is up to date if each entry is at its target,
-	 * or is 1 greater than its target.
-	 * (If it is 1 greater than the target, '/' will be printed, so it
-	 * will look correct on the next row.)
-	 */
-	for (i = 0; i < graph->mapping_size; i++) {
+	for (int i = 0; i < graph->mapping_size; i++) {
 		int target = graph->mapping[i];
 		if (target < 0)
 			continue;
@@ -833,12 +817,7 @@ static void graph_pad_horizontally(struct git_graph *graph, struct graph_line *l
 static void graph_output_padding_line(struct git_graph *graph,
 				      struct graph_line *line)
 {
-	int i;
-
-	/*
-	 * Output a padding row, that leaves all branch lines unchanged
-	 */
-	for (i = 0; i < graph->num_new_columns; i++) {
+	for (int i = 0; i < graph->num_new_columns; i++) {
 		graph_line_write_column(line, &graph->new_columns[i], '|');
 		graph_line_addch(line, ' ');
 	}
@@ -868,7 +847,7 @@ static void graph_output_skip_line(struct git_graph *graph, struct graph_line *l
 static void graph_output_pre_commit_line(struct git_graph *graph,
 					 struct graph_line *line)
 {
-	int i, seen_this;
+	int seen_this;
 
 	/*
 	 * This function formats a row that increases the space around a commit
@@ -890,7 +869,7 @@ static void graph_output_pre_commit_line(struct git_graph *graph,
 	 * Output the row
 	 */
 	seen_this = 0;
-	for (i = 0; i < graph->num_columns; i++) {
+	for (int i = 0; i < graph->num_columns; i++) {
 		struct column *col = &graph->columns[i];
 		if (col->commit == graph->commit) {
 			seen_this = 1;
@@ -977,12 +956,12 @@ static void graph_draw_octopus_merge(struct git_graph *graph, struct graph_line
 	 * the merge commit.
 	 */
 
-	int i, j;
+	int j;
 	struct column *col;
 
 	int dashed_parents = graph_num_dashed_parents(graph);
 
-	for (i = 0; i < dashed_parents; i++) {
+	for (int i = 0; i < dashed_parents; i++) {
 		j = graph->mapping[(graph->commit_index + i + 2) * 2];
 		col = &graph->new_columns[j];
 
@@ -996,7 +975,6 @@ static void graph_draw_octopus_merge(struct git_graph *graph, struct graph_line
 static void graph_output_commit_line(struct git_graph *graph, struct graph_line *line)
 {
 	int seen_this = 0;
-	int i;
 
 	/*
 	 * Output the row containing this commit
@@ -1006,7 +984,7 @@ static void graph_output_commit_line(struct git_graph *graph, struct graph_line
 	 * children that we have already processed.)
 	 */
 	seen_this = 0;
-	for (i = 0; i <= graph->num_columns; i++) {
+	for (int i = 0; i <= graph->num_columns; i++) {
 		struct column *col = &graph->columns[i];
 		struct commit *col_commit;
 		if (i == graph->num_columns) {
@@ -1072,7 +1050,7 @@ static const char merge_chars[] = {'/', '|', '\\'};
 static void graph_output_post_merge_line(struct git_graph *graph, struct graph_line *line)
 {
 	int seen_this = 0;
-	int i, j;
+	int j;
 
 	struct commit_list *first_parent = first_interesting_parent(graph);
 	struct column *parent_col = NULL;
@@ -1080,7 +1058,7 @@ static void graph_output_post_merge_line(struct git_graph *graph, struct graph_l
 	/*
 	 * Output the post-merge row
 	 */
-	for (i = 0; i <= graph->num_columns; i++) {
+	for (int i = 0; i <= graph->num_columns; i++) {
 		struct column *col = &graph->columns[i];
 		struct commit *col_commit;
 		if (i == graph->num_columns) {
@@ -1347,7 +1325,6 @@ int graph_next_line(struct git_graph *graph, struct strbuf *sb)
 
 static void graph_padding_line(struct git_graph *graph, struct strbuf *sb)
 {
-	int i;
 	struct graph_line line = { .buf = sb, .width = 0 };
 
 	if (graph->state != GRAPH_COMMIT) {
@@ -1362,7 +1339,7 @@ static void graph_padding_line(struct git_graph *graph, struct strbuf *sb)
 	 * columns.  (This happens when the current commit doesn't have any
 	 * children that we have already processed.)
 	 */
-	for (i = 0; i < graph->num_columns; i++) {
+	for (int i = 0; i < graph->num_columns; i++) {
 		struct column *col = &graph->columns[i];
 
 		graph_line_write_column(&line, col, '|');
diff --git a/grep.c b/grep.c
index 5f23d1a50c..fabb1b4d4e 100644
--- a/grep.c
+++ b/grep.c
@@ -195,14 +195,13 @@ void append_grep_pat(struct grep_opt *opt, const char *pat, size_t patlen,
 
 struct grep_opt *grep_opt_dup(const struct grep_opt *opt)
 {
-	struct grep_pat *pat;
 	struct grep_opt *ret = xmalloc(sizeof(struct grep_opt));
 	*ret = *opt;
 
 	ret->pattern_list = NULL;
 	ret->pattern_tail = &ret->pattern_list;
 
-	for(pat = opt->pattern_list; pat != NULL; pat = pat->next)
+	for (struct grep_pat *pat = opt->pattern_list; pat != NULL; pat = pat->next)
 	{
 		if(pat->token == GREP_PATTERN_HEAD)
 			append_header_grep_pattern(ret, pat->field,
@@ -232,9 +231,7 @@ static NORETURN void compile_regexp_failed(const struct grep_pat *p,
 
 static int is_fixed(const char *s, size_t len)
 {
-	size_t i;
-
-	for (i = 0; i < len; i++) {
+	for (size_t i = 0; i < len; i++) {
 		if (is_regex_special(s[i]))
 			return 0;
 	}
@@ -831,9 +828,9 @@ static void free_pattern_expr(struct grep_expr *x)
 
 static void free_grep_pat(struct grep_pat *pattern)
 {
-	struct grep_pat *p, *n;
+	struct grep_pat *n;
 
-	for (p = pattern; p; p = n) {
+	for (struct grep_pat *p = pattern; p; p = n) {
 		n = p->next;
 		switch (p->token) {
 		case GREP_PATTERN: /* atom */
@@ -1113,7 +1110,6 @@ static int match_line(struct grep_opt *opt,
 		      ssize_t *col, ssize_t *icol,
 		      enum grep_context ctx, int collect_hits)
 {
-	struct grep_pat *p;
 	int hit = 0;
 
 	if (opt->pattern_expression)
@@ -1121,7 +1117,7 @@ static int match_line(struct grep_opt *opt,
 				  collect_hits);
 
 	/* we do not call with collect_hits without being extended */
-	for (p = opt->pattern_list; p; p = p->next) {
+	for (struct grep_pat *p = opt->pattern_list; p; p = p->next) {
 		regmatch_t tmp;
 		if (match_one_pattern(p, bol, eol, ctx, &tmp, 0)) {
 			hit |= 1;
@@ -1432,13 +1428,11 @@ static void show_pre_context(struct grep_opt *opt, struct grep_source *gs,
 
 static int should_lookahead(struct grep_opt *opt)
 {
-	struct grep_pat *p;
-
 	if (opt->pattern_expression)
 		return 0; /* punt for too complex stuff */
 	if (opt->invert)
 		return 0;
-	for (p = opt->pattern_list; p; p = p->next) {
+	for (struct grep_pat *p = opt->pattern_list; p; p = p->next) {
 		if (p->token != GREP_PATTERN)
 			return 0; /* punt for "header only" and stuff */
 	}
@@ -1452,11 +1446,10 @@ static int look_ahead(struct grep_opt *opt,
 {
 	unsigned lno = *lno_p;
 	const char *bol = *bol_p;
-	struct grep_pat *p;
 	const char *sp, *last_bol;
 	regoff_t earliest = -1;
 
-	for (p = opt->pattern_list; p; p = p->next) {
+	for (struct grep_pat *p = opt->pattern_list; p; p = p->next) {
 		int hit;
 		regmatch_t m;
 
diff --git a/hash-lookup.c b/hash-lookup.c
index 9f0f95e2b9..6c57c9e8ca 100644
--- a/hash-lookup.c
+++ b/hash-lookup.c
@@ -63,9 +63,9 @@ int oid_pos(const struct object_id *oid, const void *table, size_t nr,
 		return -1;
 
 	if (nr != 1) {
-		size_t lov, hiv, miv, ofs;
+		size_t lov, hiv, miv;
 
-		for (ofs = 0; ofs < the_hash_algo->rawsz - 2; ofs += 2) {
+		for (size_t ofs = 0; ofs < the_hash_algo->rawsz - 2; ofs += 2) {
 			lov = take2(fn(0, table), ofs);
 			hiv = take2(fn(nr - 1, table), ofs);
 			miv = take2(oid, ofs);
diff --git a/hashmap.c b/hashmap.c
index ee45ef0085..6aca26c9a6 100644
--- a/hashmap.c
+++ b/hashmap.c
@@ -115,11 +115,11 @@ int hashmap_bucket(const struct hashmap *map, unsigned int hash)
 static void rehash(struct hashmap *map, unsigned int newsize)
 {
 	/* map->table MUST NOT be NULL when this function is called */
-	unsigned int i, oldsize = map->tablesize;
+	unsigned int oldsize = map->tablesize;
 	struct hashmap_entry **oldtable = map->table;
 
 	alloc_table(map, newsize);
-	for (i = 0; i < oldsize; i++) {
+	for (unsigned int i = 0; i < oldsize; i++) {
 		struct hashmap_entry *e = oldtable[i];
 		while (e) {
 			struct hashmap_entry *next = e->next;
diff --git a/help.c b/help.c
index 2dbe57b413..0d642a9669 100644
--- a/help.c
+++ b/help.c
@@ -67,7 +67,7 @@ static const char *drop_prefix(const char *name, uint32_t category)
 
 static void extract_cmds(struct cmdname_help **p_cmds, uint32_t mask)
 {
-	int i, nr = 0;
+	int nr = 0;
 	struct cmdname_help *cmds;
 
 	if (ARRAY_SIZE(command_list) == 0)
@@ -75,7 +75,7 @@ static void extract_cmds(struct cmdname_help **p_cmds, uint32_t mask)
 
 	ALLOC_ARRAY(cmds, ARRAY_SIZE(command_list) + 1);
 
-	for (i = 0; i < ARRAY_SIZE(command_list); i++) {
+	for (int i = 0; i < ARRAY_SIZE(command_list); i++) {
 		const struct cmdname_help *cmd = command_list + i;
 
 		if (!(cmd->category & mask))
@@ -93,9 +93,7 @@ static void extract_cmds(struct cmdname_help **p_cmds, uint32_t mask)
 static void print_command_list(const struct cmdname_help *cmds,
 			       uint32_t mask, int longest)
 {
-	int i;
-
-	for (i = 0; cmds[i].name; i++) {
+	for (int i = 0; cmds[i].name; i++) {
 		if (cmds[i].category & mask) {
 			size_t len = strlen(cmds[i].name);
 			printf("   %s   ", cmds[i].name);
@@ -159,8 +157,7 @@ void add_cmdname(struct cmdnames *cmds, const char *name, int len)
 
 static void clean_cmdnames(struct cmdnames *cmds)
 {
-	int i;
-	for (i = 0; i < cmds->cnt; ++i)
+	for (int i = 0; i < cmds->cnt; ++i)
 		free(cmds->names[i]);
 	free(cmds->names);
 	cmds->cnt = 0;
@@ -176,12 +173,12 @@ static int cmdname_compare(const void *a_, const void *b_)
 
 static void uniq(struct cmdnames *cmds)
 {
-	int i, j;
+	int j;
 
 	if (!cmds->cnt)
 		return;
 
-	for (i = j = 1; i < cmds->cnt; i++) {
+	for (int i = j = 1; i < cmds->cnt; i++) {
 		if (!strcmp(cmds->names[i]->name, cmds->names[j-1]->name))
 			free(cmds->names[i]);
 		else
@@ -218,9 +215,7 @@ static void pretty_print_cmdnames(struct cmdnames *cmds, unsigned int colopts)
 {
 	struct string_list list = STRING_LIST_INIT_NODUP;
 	struct column_options copts;
-	int i;
-
-	for (i = 0; i < cmds->cnt; i++)
+	for (int i = 0; i < cmds->cnt; i++)
 		string_list_append(&list, cmds->names[i]->name);
 	/*
 	 * always enable column display, we only consult column.*
@@ -350,13 +345,12 @@ void list_common_cmds_help(void)
 void list_all_main_cmds(struct string_list *list)
 {
 	struct cmdnames main_cmds, other_cmds;
-	int i;
 
 	memset(&main_cmds, 0, sizeof(main_cmds));
 	memset(&other_cmds, 0, sizeof(other_cmds));
 	load_command_list("git-", &main_cmds, &other_cmds);
 
-	for (i = 0; i < main_cmds.cnt; i++)
+	for (int i = 0; i < main_cmds.cnt; i++)
 		string_list_append(list, main_cmds.names[i]->name);
 
 	clean_cmdnames(&main_cmds);
@@ -366,13 +360,12 @@ void list_all_main_cmds(struct string_list *list)
 void list_all_other_cmds(struct string_list *list)
 {
 	struct cmdnames main_cmds, other_cmds;
-	int i;
 
 	memset(&main_cmds, 0, sizeof(main_cmds));
 	memset(&other_cmds, 0, sizeof(other_cmds));
 	load_command_list("git-", &main_cmds, &other_cmds);
 
-	for (i = 0; i < other_cmds.cnt; i++)
+	for (int i = 0; i < other_cmds.cnt; i++)
 		string_list_append(list, other_cmds.names[i]->name);
 
 	clean_cmdnames(&main_cmds);
@@ -476,12 +469,11 @@ static int get_alias(const char *var, const char *value,
 static void list_all_cmds_help_external_commands(void)
 {
 	struct string_list others = STRING_LIST_INIT_DUP;
-	int i;
 
 	list_all_other_cmds(&others);
 	if (others.nr)
 		printf("\n%s\n", _("External commands"));
-	for (i = 0; i < others.nr; i++)
+	for (int i = 0; i < others.nr; i++)
 		printf("   %s\n", others.items[i].string);
 	string_list_clear(&others, 0);
 }
@@ -532,8 +524,7 @@ void list_all_cmds_help(int show_external_commands, int show_aliases)
 
 int is_in_cmdlist(struct cmdnames *c, const char *s)
 {
-	int i;
-	for (i = 0; i < c->cnt; i++)
+	for (int i = 0; i < c->cnt; i++)
 		if (!strcmp(s, c->names[i]->name))
 			return 1;
 	return 0;
@@ -585,10 +576,9 @@ static int levenshtein_compare(const void *p1, const void *p2)
 
 static void add_cmd_list(struct cmdnames *cmds, struct cmdnames *old)
 {
-	int i;
 	ALLOC_GROW(cmds->names, cmds->cnt + old->cnt, cmds->alloc);
 
-	for (i = 0; i < old->cnt; i++)
+	for (int i = 0; i < old->cnt; i++)
 		cmds->names[cmds->cnt++] = old->names[i];
 	FREE_AND_NULL(old->names);
 	old->cnt = 0;
diff --git a/hex.c b/hex.c
index d42262bdca..0a322eaee6 100644
--- a/hex.c
+++ b/hex.c
@@ -5,8 +5,7 @@
 static int get_hash_hex_algop(const char *hex, unsigned char *hash,
 			      const struct git_hash_algo *algop)
 {
-	int i;
-	for (i = 0; i < algop->rawsz; i++) {
+	for (int i = 0; i < algop->rawsz; i++) {
 		int val = hex2chr(hex);
 		if (val < 0)
 			return -1;
@@ -36,8 +35,7 @@ int get_oid_hex_algop(const char *hex, struct object_id *oid,
  */
 int get_oid_hex_any(const char *hex, struct object_id *oid)
 {
-	int i;
-	for (i = GIT_HASH_NALGOS - 1; i > 0; i--) {
+	for (int i = GIT_HASH_NALGOS - 1; i > 0; i--) {
 		if (!get_oid_hex_algop(hex, oid, &hash_algos[i]))
 			return i;
 	}
@@ -77,7 +75,6 @@ char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
 {
 	static const char hex[] = "0123456789abcdef";
 	char *buf = buffer;
-	int i;
 
 	/*
 	 * Our struct object_id has been memset to 0, so default to printing
@@ -86,7 +83,7 @@ char *hash_to_hex_algop_r(char *buffer, const unsigned char *hash,
 	if (algop == &hash_algos[0])
 		algop = the_hash_algo;
 
-	for (i = 0; i < algop->rawsz; i++) {
+	for (int i = 0; i < algop->rawsz; i++) {
 		unsigned int val = *hash++;
 		*buf++ = hex[val >> 4];
 		*buf++ = hex[val & 0xf];
diff --git a/http-backend.c b/http-backend.c
index 1ed1e29d07..592b1a3a6a 100644
--- a/http-backend.c
+++ b/http-backend.c
@@ -240,13 +240,13 @@ static void get_idx_file(struct strbuf *hdr, char *name)
 
 static void http_config(void)
 {
-	int i, value = 0;
+	int value = 0;
 	struct strbuf var = STRBUF_INIT;
 
 	git_config_get_bool("http.getanyfile", &getanyfile);
 	git_config_get_ulong("http.maxrequestbuffer", &max_request_buffer);
 
-	for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
+	for (int i = 0; i < ARRAY_SIZE(rpc_service); i++) {
 		struct rpc_service *svc = &rpc_service[i];
 		strbuf_addf(&var, "http.%s", svc->config_name);
 		if (!git_config_get_bool(var.buf, &value))
@@ -261,12 +261,11 @@ static struct rpc_service *select_service(struct strbuf *hdr, const char *name)
 {
 	const char *svc_name;
 	struct rpc_service *svc = NULL;
-	int i;
 
 	if (!skip_prefix(name, "git-", &svc_name))
 		forbidden(hdr, "Unsupported service: '%s'", name);
 
-	for (i = 0; i < ARRAY_SIZE(rpc_service); i++) {
+	for (int i = 0; i < ARRAY_SIZE(rpc_service); i++) {
 		struct rpc_service *s = &rpc_service[i];
 		if (!strcmp(s->name, svc_name)) {
 			svc = s;
@@ -755,7 +754,6 @@ int cmd_main(int argc UNUSED, const char **argv UNUSED)
 	char *dir;
 	struct service_cmd *cmd = NULL;
 	char *cmd_arg = NULL;
-	int i;
 	struct strbuf hdr = STRBUF_INIT;
 
 	set_die_routine(die_webcgi);
@@ -767,7 +765,7 @@ int cmd_main(int argc UNUSED, const char **argv UNUSED)
 		method = "GET";
 	dir = getdir();
 
-	for (i = 0; i < ARRAY_SIZE(services); i++) {
+	for (int i = 0; i < ARRAY_SIZE(services); i++) {
 		struct service_cmd *c = &services[i];
 		regex_t re;
 		regmatch_t out[1];
diff --git a/http-push.c b/http-push.c
index 12d1113741..2835b4b3b6 100644
--- a/http-push.c
+++ b/http-push.c
@@ -608,12 +608,10 @@ static void finish_request(struct transfer_request *request)
 static int is_running_queue;
 static int fill_active_slot(void *data UNUSED)
 {
-	struct transfer_request *request;
-
 	if (aborted || !is_running_queue)
 		return 0;
 
-	for (request = request_queue_head; request; request = request->next) {
+	for (struct transfer_request *request = request_queue_head; request; request = request->next) {
 		if (request->state == NEED_FETCH) {
 			start_fetch_loose(request);
 			return 1;
@@ -1330,7 +1328,6 @@ static struct object_list **process_tree(struct tree *tree,
 
 static int get_delta(struct rev_info *revs, struct remote_lock *lock)
 {
-	int i;
 	struct commit *commit;
 	struct object_list **p = &objects;
 	int count = 0;
@@ -1343,7 +1340,7 @@ static int get_delta(struct rev_info *revs, struct remote_lock *lock)
 			count += add_send_request(&commit->object, lock);
 	}
 
-	for (i = 0; i < revs->pending.nr; i++) {
+	for (int i = 0; i < revs->pending.nr; i++) {
 		struct object_array_entry *entry = revs->pending.objects + i;
 		struct object *obj = entry->item;
 		const char *name = entry->name;
@@ -1587,7 +1584,6 @@ static int delete_remote_branch(const char *pattern, int force)
 	char *symref = NULL;
 	int match;
 	int patlen = strlen(pattern);
-	int i;
 	struct active_request_slot *slot;
 	struct slot_results results;
 	char *url;
@@ -1619,7 +1615,7 @@ static int delete_remote_branch(const char *pattern, int force)
 		return error("Remote HEAD is not a symref");
 
 	/* Remote branch must not be the remote HEAD */
-	for (i = 0; symref && i < MAXDEPTH; i++) {
+	for (int i = 0; symref && i < MAXDEPTH; i++) {
 		if (!strcmp(remote_ref->name, symref))
 			return error("Remote branch %s is the current HEAD",
 				     remote_ref->name);
diff --git a/http-walker.c b/http-walker.c
index b395ef1327..6b743966ed 100644
--- a/http-walker.c
+++ b/http-walker.c
@@ -591,13 +591,12 @@ static void cleanup(struct walker *walker)
 
 struct walker *get_http_walker(const char *url)
 {
-	char *s;
 	struct walker_data *data = xmalloc(sizeof(struct walker_data));
 	struct walker *walker = xmalloc(sizeof(struct walker));
 
 	data->alt = xmalloc(sizeof(*data->alt));
 	data->alt->base = xstrdup(url);
-	for (s = data->alt->base + strlen(data->alt->base) - 1; *s == '/'; --s)
+	for (char *s = data->alt->base + strlen(data->alt->base) - 1; *s == '/'; --s)
 		*s = 0;
 
 	data->alt->got_indices = 0;
diff --git a/http.c b/http.c
index e73b136e58..c87eeb78b7 100644
--- a/http.c
+++ b/http.c
@@ -783,7 +783,7 @@ static void redact_sensitive_info_header(struct strbuf *header)
 static void curl_dump_header(const char *text, unsigned char *ptr, size_t size, int hide_sensitive_header)
 {
 	struct strbuf out = STRBUF_INIT;
-	struct strbuf **headers, **header;
+	struct strbuf **headers;
 
 	strbuf_addf(&out, "%s, %10.10ld bytes (0x%8.8lx)\n",
 		text, (long)size, (long)size);
@@ -792,7 +792,7 @@ static void curl_dump_header(const char *text, unsigned char *ptr, size_t size,
 	strbuf_add(&out, ptr, size);
 	headers = strbuf_split_max(&out, '\n', 0);
 
-	for (header = headers; *header; header++) {
+	for (struct strbuf **header = headers; *header; header++) {
 		if (hide_sensitive_header)
 			redact_sensitive_header(*header, 0);
 		strbuf_insertstr((*header), 0, text);
@@ -807,7 +807,6 @@ static void curl_dump_header(const char *text, unsigned char *ptr, size_t size,
 
 static void curl_dump_data(const char *text, unsigned char *ptr, size_t size)
 {
-	size_t i;
 	struct strbuf out = STRBUF_INIT;
 	unsigned int width = 60;
 
@@ -815,7 +814,7 @@ static void curl_dump_data(const char *text, unsigned char *ptr, size_t size)
 		text, (long)size, (long)size);
 	trace_strbuf(&trace_curl, &out);
 
-	for (i = 0; i < size; i += width) {
+	for (size_t i = 0; i < size; i += width) {
 		size_t w;
 
 		strbuf_reset(&out);
@@ -946,7 +945,6 @@ static long get_curl_allowed_protocols(int from_user, struct strbuf *list)
 #ifdef GIT_CURL_HAVE_CURL_HTTP_VERSION_2
 static int get_curl_http_version_opt(const char *version_string, long *opt)
 {
-	int i;
 	static struct {
 		const char *name;
 		long opt_token;
@@ -955,7 +953,7 @@ static int get_curl_http_version_opt(const char *version_string, long *opt)
 		{ "HTTP/2", CURL_HTTP_VERSION_2 }
 	};
 
-	for (i = 0; i < ARRAY_SIZE(choice); i++) {
+	for (int i = 0; i < ARRAY_SIZE(choice); i++) {
 		if (!strcmp(version_string, choice[i].name)) {
 			*opt = choice[i].opt_token;
 			return 0;
@@ -1674,12 +1672,11 @@ static inline int needs_quote(int ch)
 static char *quote_ref_url(const char *base, const char *ref)
 {
 	struct strbuf buf = STRBUF_INIT;
-	const char *cp;
 	int ch;
 
 	end_url_with_slash(&buf, base);
 
-	for (cp = ref; (ch = *cp) != 0; cp++)
+	for (const char *cp = ref; (ch = *cp) != 0; cp++)
 		if (needs_quote(ch))
 			strbuf_addf(&buf, "%%%02x", ch);
 		else
diff --git a/ident.c b/ident.c
index cc7afdbf81..be1685ad14 100644
--- a/ident.c
+++ b/ident.c
@@ -59,13 +59,7 @@ static struct passwd *xgetpwuid_self(int *is_bogus)
 
 static void copy_gecos(const struct passwd *w, struct strbuf *name)
 {
-	char *src;
-
-	/* Traditionally GECOS field had office phone numbers etc, separated
-	 * with commas.  Also & stands for capitalized form of the login name.
-	 */
-
-	for (src = get_gecos(w); *src && *src != ','; src++) {
+	for (char *src = get_gecos(w); *src && *src != ','; src++) {
 		int ch = *src;
 		if (ch != '&')
 			strbuf_addch(name, ch);
@@ -228,7 +222,7 @@ static int has_non_crud(const char *str)
  */
 static void strbuf_addstr_without_crud(struct strbuf *sb, const char *src)
 {
-	size_t i, len;
+	size_t len;
 	unsigned char c;
 
 	/* Remove crud from the beginning.. */
@@ -254,7 +248,7 @@ static void strbuf_addstr_without_crud(struct strbuf *sb, const char *src)
 	 * so 'len' is our maximum.
 	 */
 	strbuf_grow(sb, len);
-	for (i = 0; i < len; i++) {
+	for (size_t i = 0; i < len; i++) {
 		c = *src++;
 		switch (c) {
 		case '\n': case '<': case '>':
diff --git a/imap-send.c b/imap-send.c
index f2e1947e63..018e1715eb 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -869,7 +869,7 @@ static char hexchar(unsigned int b)
 #define ENCODED_SIZE(n) (4 * DIV_ROUND_UP((n), 3))
 static char *cram(const char *challenge_64, const char *user, const char *pass)
 {
-	int i, resp_len, encoded_len, decoded_len;
+	int resp_len, encoded_len, decoded_len;
 	unsigned char hash[16];
 	char hex[33];
 	char *response, *response_64, *challenge;
@@ -888,7 +888,7 @@ static char *cram(const char *challenge_64, const char *user, const char *pass)
 		die("HMAC error");
 
 	hex[32] = 0;
-	for (i = 0; i < 16; i++) {
+	for (int i = 0; i < 16; i++) {
 		hex[2 * i] = hexchar((hash[i] >> 4) & 0xf);
 		hex[2 * i + 1] = hexchar(hash[i] & 0xf);
 	}
diff --git a/json-writer.c b/json-writer.c
index 005c820aa4..538d095bf8 100644
--- a/json-writer.c
+++ b/json-writer.c
@@ -46,9 +46,7 @@ static void append_quoted_string(struct strbuf *out, const char *in)
 
 static void indent_pretty(struct json_writer *jw)
 {
-	int k;
-
-	for (k = 0; k < jw->open_stack.len; k++)
+	for (int k = 0; k < jw->open_stack.len; k++)
 		strbuf_addstr(&jw->json, "  ");
 }
 
@@ -204,10 +202,8 @@ static void increase_indent(struct strbuf *sb,
 			    const struct json_writer *jw,
 			    int indent)
 {
-	int k;
-
 	strbuf_reset(sb);
-	for (k = 0; k < jw->json.len; k++) {
+	for (int k = 0; k < jw->json.len; k++) {
 		char ch = jw->json.buf[k];
 		strbuf_addch(sb, ch);
 		if (ch == '\n')
@@ -218,11 +214,10 @@ static void increase_indent(struct strbuf *sb,
 static void kill_indent(struct strbuf *sb,
 			const struct json_writer *jw)
 {
-	int k;
 	int eat_it = 0;
 
 	strbuf_reset(sb);
-	for (k = 0; k < jw->json.len; k++) {
+	for (int k = 0; k < jw->json.len; k++) {
 		char ch = jw->json.buf[k];
 		if (eat_it && ch == ' ')
 			continue;
@@ -355,9 +350,7 @@ void jw_array_sub_jw(struct json_writer *jw, const struct json_writer *value)
 
 void jw_array_argc_argv(struct json_writer *jw, int argc, const char **argv)
 {
-	int k;
-
-	for (k = 0; k < argc; k++)
+	for (int k = 0; k < argc; k++)
 		jw_array_string(jw, argv[k]);
 }
 
diff --git a/khash.h b/khash.h
index ff88163177..d66c1eac90 100644
--- a/khash.h
+++ b/khash.h
@@ -298,8 +298,8 @@ static const double __ac_HASH_UPPER = 0.77;
   @param  vvar  Variable to which value will be assigned
   @param  code  Block of code to execute
  */
-#define kh_foreach(h, kvar, vvar, code) { khint_t __i;		\
-	for (__i = kh_begin(h); __i != kh_end(h); ++__i) {		\
+#define kh_foreach(h, kvar, vvar, code) { 		\
+	for (khint_t __i = kh_begin(h); __i != kh_end(h); ++__i) {		\
 		if (!kh_exist(h,__i)) continue;						\
 		(kvar) = kh_key(h,__i);								\
 		(vvar) = kh_val(h,__i);								\
@@ -312,8 +312,8 @@ static const double __ac_HASH_UPPER = 0.77;
   @param  vvar  Variable to which value will be assigned
   @param  code  Block of code to execute
  */
-#define kh_foreach_value(h, vvar, code) { khint_t __i;		\
-	for (__i = kh_begin(h); __i != kh_end(h); ++__i) {		\
+#define kh_foreach_value(h, vvar, code) { 		\
+	for (khint_t __i = kh_begin(h); __i != kh_end(h); ++__i) {		\
 		if (!kh_exist(h,__i)) continue;						\
 		(vvar) = kh_val(h,__i);								\
 		code;												\
diff --git a/line-log.c b/line-log.c
index 8ff6ccb772..262c944edf 100644
--- a/line-log.c
+++ b/line-log.c
@@ -92,15 +92,13 @@ static int range_cmp(const void *_r, const void *_s)
  */
 static void range_set_check_invariants(struct range_set *rs)
 {
-	unsigned int i;
-
 	if (!rs)
 		return;
 
 	if (rs->nr)
 		assert(rs->ranges[0].start < rs->ranges[0].end);
 
-	for (i = 1; i < rs->nr; i++) {
+	for (unsigned int i = 1; i < rs->nr; i++) {
 		assert(rs->ranges[i-1].end < rs->ranges[i].start);
 		assert(rs->ranges[i].start < rs->ranges[i].end);
 	}
@@ -112,12 +110,11 @@ static void range_set_check_invariants(struct range_set *rs)
  */
 void sort_and_merge_range_set(struct range_set *rs)
 {
-	unsigned int i;
 	unsigned int o = 0; /* output cursor */
 
 	QSORT(rs->ranges, rs->nr, range_cmp);
 
-	for (i = 0; i < rs->nr; i++) {
+	for (unsigned int i = 0; i < rs->nr; i++) {
 		if (rs->ranges[i].start == rs->ranges[i].end)
 			continue;
 		if (o > 0 && rs->ranges[i].start <= rs->ranges[o-1].end) {
@@ -188,8 +185,8 @@ static void range_set_union(struct range_set *out,
 static void range_set_difference(struct range_set *out,
 				  struct range_set *a, struct range_set *b)
 {
-	unsigned int i, j =  0;
-	for (i = 0; i < a->nr; i++) {
+	unsigned int j =  0;
+	for (unsigned int i = 0; i < a->nr; i++) {
 		long start = a->ranges[i].start;
 		long end = a->ranges[i].end;
 		while (start < end) {
@@ -399,11 +396,11 @@ static void diff_ranges_filter_touched(struct diff_ranges *out,
 				       struct diff_ranges *diff,
 				       struct range_set *rs)
 {
-	unsigned int i, j = 0;
+	unsigned int j = 0;
 
 	assert(out->target.nr == 0);
 
-	for (i = 0; i < diff->target.nr; i++) {
+	for (unsigned int i = 0; i < diff->target.nr; i++) {
 		while (diff->target.ranges[i].start > rs->ranges[j].end) {
 			j++;
 			if (j == rs->nr)
@@ -428,13 +425,13 @@ static void range_set_shift_diff(struct range_set *out,
 				 struct range_set *rs,
 				 struct diff_ranges *diff)
 {
-	unsigned int i, j = 0;
+	unsigned int j = 0;
 	long offset = 0;
 	struct range *src = rs->ranges;
 	struct range *target = diff->target.ranges;
 	struct range *parent = diff->parent.ranges;
 
-	for (i = 0; i < rs->nr; i++) {
+	for (unsigned int i = 0; i < rs->nr; i++) {
 		while (j < diff->target.nr && src[i].start >= target[j].start) {
 			offset += (parent[j].end-parent[j].start)
 				- (target[j].end-target[j].start);
@@ -475,9 +472,7 @@ static struct commit *check_single_commit(struct rev_info *revs)
 {
 	struct object *commit = NULL;
 	int found = -1;
-	int i;
-
-	for (i = 0; i < revs->pending.nr; i++) {
+	for (int i = 0; i < revs->pending.nr; i++) {
 		struct object *obj = revs->pending.objects[i].item;
 		if (obj->flags & UNINTERESTING)
 			continue;
@@ -729,11 +724,10 @@ static struct line_log_data *lookup_line_range(struct rev_info *revs,
 					       struct commit *commit)
 {
 	struct line_log_data *ret = NULL;
-	struct line_log_data *d;
 
 	ret = lookup_decoration(&revs->line_log_data, &commit->object);
 
-	for (d = ret; d; d = d->next)
+	for (struct line_log_data *d = ret; d; d = d->next)
 		range_set_check_invariants(&d->ranges);
 
 	return ret;
@@ -758,11 +752,10 @@ static int same_paths_in_pathspec_and_range(struct pathspec *pathspec,
 static void parse_pathspec_from_ranges(struct pathspec *pathspec,
 				       struct line_log_data *range)
 {
-	struct line_log_data *r;
 	struct strvec array = STRVEC_INIT;
 	const char **paths;
 
-	for (r = range; r; r = r->next)
+	for (struct line_log_data *r = range; r; r = r->next)
 		strvec_push(&array, r->path);
 	paths = strvec_detach(&array);
 
@@ -793,11 +786,10 @@ static void move_diff_queue(struct diff_queue_struct *dst,
 
 static void filter_diffs_for_paths(struct line_log_data *range, int keep_deletions)
 {
-	int i;
 	struct diff_queue_struct outq;
 	DIFF_QUEUE_CLEAR(&outq);
 
-	for (i = 0; i < diff_queued_diff.nr; i++) {
+	for (int i = 0; i < diff_queued_diff.nr; i++) {
 		struct diff_filepair *p = diff_queued_diff.queue[i];
 		struct line_log_data *rg = NULL;
 
@@ -823,8 +815,7 @@ static void filter_diffs_for_paths(struct line_log_data *range, int keep_deletio
 
 static inline int diff_might_be_rename(void)
 {
-	int i;
-	for (i = 0; i < diff_queued_diff.nr; i++)
+	for (int i = 0; i < diff_queued_diff.nr; i++)
 		if (!DIFF_FILE_VALID(diff_queued_diff.queue[i]->one)) {
 			/* fprintf(stderr, "diff_might_be_rename found creation of: %s\n", */
 			/* 	diff_queued_diff.queue[i]->two->path); */
@@ -911,7 +902,7 @@ static char *output_prefix(struct diff_options *opt)
 
 static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *range)
 {
-	unsigned int i, j = 0;
+	unsigned int j = 0;
 	long p_lines, t_lines;
 	unsigned long *p_ends = NULL, *t_ends = NULL;
 	struct diff_filepair *pair = range->pair;
@@ -939,7 +930,7 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rang
 	       pair->one->oid_valid ? pair->one->path : "/dev/null",
 	       c_reset);
 	fprintf(opt->file, "%s%s+++ b/%s%s\n", prefix, c_meta, pair->two->path, c_reset);
-	for (i = 0; i < range->ranges.nr; i++) {
+	for (unsigned int i = 0; i < range->ranges.nr; i++) {
 		long p_start, p_end;
 		long t_start = range->ranges.ranges[i].start;
 		long t_end = range->ranges.ranges[i].end;
@@ -1100,11 +1091,11 @@ static int process_all_files(struct line_log_data **range_out,
 			     struct diff_queue_struct *queue,
 			     struct line_log_data *range)
 {
-	int i, changed = 0;
+	int changed = 0;
 
 	*range_out = line_log_data_copy(range);
 
-	for (i = 0; i < queue->nr; i++) {
+	for (int i = 0; i < queue->nr; i++) {
 		struct diff_ranges *pairdiff = NULL;
 		struct diff_filepair *pair = queue->queue[i];
 		if (process_diff_filepair(rev, pair, *range_out, &pairdiff)) {
diff --git a/linear-assignment.c b/linear-assignment.c
index 5416cbcf40..a8ccdfd84a 100644
--- a/linear-assignment.c
+++ b/linear-assignment.c
@@ -17,7 +17,7 @@ void compute_assignment(int column_count, int row_count, int *cost,
 {
 	int *v, *d;
 	int *free_row, free_count = 0, saved_free_count, *pred, *col;
-	int i, j, phase;
+	int i, j;
 
 	if (column_count < 2) {
 		memset(column2row, 0, sizeof(int) * column_count);
@@ -73,7 +73,7 @@ void compute_assignment(int column_count, int row_count, int *cost,
 	}
 
 	/* augmenting row reduction */
-	for (phase = 0; phase < 2; phase++) {
+	for (int phase = 0; phase < 2; phase++) {
 		int k = 0;
 
 		saved_free_count = free_count;
diff --git a/list-objects-filter-options.c b/list-objects-filter-options.c
index c5f363ca6f..2f34279a37 100644
--- a/list-objects-filter-options.c
+++ b/list-objects-filter-options.c
@@ -158,7 +158,6 @@ static int parse_combine_filter(
 	struct strbuf *errbuf)
 {
 	struct strbuf **subspecs = strbuf_split_str(arg, '+', 0);
-	size_t sub;
 	int result = 0;
 
 	if (!subspecs[0]) {
@@ -167,7 +166,7 @@ static int parse_combine_filter(
 		goto cleanup;
 	}
 
-	for (sub = 0; subspecs[sub] && !result; sub++) {
+	for (size_t sub = 0; subspecs[sub] && !result; sub++) {
 		if (subspecs[sub + 1]) {
 			/*
 			 * This is not the last subspec. Remove trailing "+" so
@@ -317,13 +316,11 @@ const char *expand_list_objects_filter_spec(
 void list_objects_filter_release(
 	struct list_objects_filter_options *filter_options)
 {
-	size_t sub;
-
 	if (!filter_options)
 		return;
 	strbuf_release(&filter_options->filter_spec);
 	free(filter_options->sparse_oid_name);
-	for (sub = 0; sub < filter_options->sub_nr; sub++)
+	for (size_t sub = 0; sub < filter_options->sub_nr; sub++)
 		list_objects_filter_release(&filter_options->sub[sub]);
 	free(filter_options->sub);
 	list_objects_filter_init(filter_options);
@@ -395,8 +392,6 @@ void list_objects_filter_copy(
 	struct list_objects_filter_options *dest,
 	const struct list_objects_filter_options *src)
 {
-	int i;
-
 	/* Copy everything. We will overwrite the pointers shortly. */
 	memcpy(dest, src, sizeof(struct list_objects_filter_options));
 
@@ -405,7 +400,7 @@ void list_objects_filter_copy(
 	dest->sparse_oid_name = xstrdup_or_null(src->sparse_oid_name);
 
 	ALLOC_ARRAY(dest->sub, dest->sub_alloc);
-	for (i = 0; i < src->sub_nr; i++)
+	for (int i = 0; i < src->sub_nr; i++)
 		list_objects_filter_copy(&dest->sub[i], &src->sub[i]);
 }
 
diff --git a/list-objects-filter.c b/list-objects-filter.c
index da287cc8e0..ff0563703a 100644
--- a/list-objects-filter.c
+++ b/list-objects-filter.c
@@ -680,9 +680,7 @@ static enum list_objects_filter_result filter_combine(
 	struct combine_filter_data *d = filter_data;
 	enum list_objects_filter_result combined_result =
 		LOFR_DO_SHOW | LOFR_MARK_SEEN | LOFR_SKIP_TREE;
-	size_t sub;
-
-	for (sub = 0; sub < d->nr; sub++) {
+	for (size_t sub = 0; sub < d->nr; sub++) {
 		enum list_objects_filter_result sub_result = process_subfilter(
 			r, filter_situation, obj, pathname, filename,
 			&d->sub[sub]);
@@ -700,8 +698,7 @@ static enum list_objects_filter_result filter_combine(
 static void filter_combine__free(void *filter_data)
 {
 	struct combine_filter_data *d = filter_data;
-	size_t sub;
-	for (sub = 0; sub < d->nr; sub++) {
+	for (size_t sub = 0; sub < d->nr; sub++) {
 		list_objects_filter__free(d->sub[sub].filter);
 		oidset_clear(&d->sub[sub].seen);
 		if (d->sub[sub].omits.set.size)
@@ -725,9 +722,7 @@ static void filter_combine__finalize_omits(
 	void *filter_data)
 {
 	struct combine_filter_data *d = filter_data;
-	size_t sub;
-
-	for (sub = 0; sub < d->nr; sub++) {
+	for (size_t sub = 0; sub < d->nr; sub++) {
 		add_all(omits, &d->sub[sub].omits);
 		oidset_clear(&d->sub[sub].omits);
 	}
@@ -738,11 +733,10 @@ static void filter_combine__init(
 	struct filter* filter)
 {
 	struct combine_filter_data *d = xcalloc(1, sizeof(*d));
-	size_t sub;
 
 	d->nr = filter_options->sub_nr;
 	CALLOC_ARRAY(d->sub, d->nr);
-	for (sub = 0; sub < d->nr; sub++)
+	for (size_t sub = 0; sub < d->nr; sub++)
 		d->sub[sub].filter = list_objects_filter__init(
 			filter->omits ? &d->sub[sub].omits : NULL,
 			&filter_options->sub[sub]);
diff --git a/list-objects.c b/list-objects.c
index f39b68faf5..2934a8e6ad 100644
--- a/list-objects.c
+++ b/list-objects.c
@@ -233,9 +233,7 @@ static void mark_edge_parents_uninteresting(struct commit *commit,
 					    struct rev_info *revs,
 					    show_edge_fn show_edge)
 {
-	struct commit_list *parents;
-
-	for (parents = commit->parents; parents; parents = parents->next) {
+	for (struct commit_list *parents = commit->parents; parents; parents = parents->next) {
 		struct commit *parent = parents->item;
 		if (!(parent->object.flags & UNINTERESTING))
 			continue;
@@ -253,9 +251,7 @@ static void add_edge_parents(struct commit *commit,
 			     show_edge_fn show_edge,
 			     struct oidset *set)
 {
-	struct commit_list *parents;
-
-	for (parents = commit->parents; parents; parents = parents->next) {
+	for (struct commit_list *parents = commit->parents; parents; parents = parents->next) {
 		struct commit *parent = parents->item;
 		struct tree *tree = repo_get_commit_tree(the_repository,
 							 parent);
@@ -280,14 +276,13 @@ void mark_edges_uninteresting(struct rev_info *revs,
 			      show_edge_fn show_edge,
 			      int sparse)
 {
-	struct commit_list *list;
 	int i;
 
 	if (sparse) {
 		struct oidset set;
 		oidset_init(&set, 16);
 
-		for (list = revs->commits; list; list = list->next) {
+		for (struct commit_list *list = revs->commits; list; list = list->next) {
 			struct commit *commit = list->item;
 			struct tree *tree = repo_get_commit_tree(the_repository,
 								 commit);
@@ -302,7 +297,7 @@ void mark_edges_uninteresting(struct rev_info *revs,
 		mark_trees_uninteresting_sparse(revs->repo, &set);
 		oidset_clear(&set);
 	} else {
-		for (list = revs->commits; list; list = list->next) {
+		for (struct commit_list *list = revs->commits; list; list = list->next) {
 			struct commit *commit = list->item;
 			if (commit->object.flags & UNINTERESTING) {
 				mark_tree_uninteresting(revs->repo,
@@ -341,11 +336,9 @@ static void add_pending_tree(struct rev_info *revs, struct tree *tree)
 static void traverse_non_commits(struct traversal_context *ctx,
 				 struct strbuf *base)
 {
-	int i;
-
 	assert(base->len == 0);
 
-	for (i = 0; i < ctx->revs->pending.nr; i++) {
+	for (int i = 0; i < ctx->revs->pending.nr; i++) {
 		struct object_array_entry *pending = ctx->revs->pending.objects + i;
 		struct object *obj = pending->item;
 		const char *name = pending->name;
diff --git a/log-tree.c b/log-tree.c
index 337b9334cd..8b7468707d 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -147,7 +147,6 @@ static int add_ref_decoration(const char *refname, const struct object_id *oid,
 			      int flags UNUSED,
 			      void *cb_data)
 {
-	int i;
 	struct object *obj;
 	enum object_type objtype;
 	enum decoration_type deco_type = DECORATION_NONE;
@@ -177,7 +176,7 @@ static int add_ref_decoration(const char *refname, const struct object_id *oid,
 		return 0;
 	obj = lookup_object_by_type(the_repository, oid, objtype);
 
-	for (i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
+	for (int i = 0; i < ARRAY_SIZE(ref_namespace); i++) {
 		struct ref_namespace_info *info = &ref_namespace[i];
 
 		if (!info->decoration)
@@ -240,8 +239,7 @@ void load_ref_decorations(struct decoration_filter *filter, int flags)
 
 static void show_parents(struct commit *commit, int abbrev, FILE *file)
 {
-	struct commit_list *p;
-	for (p = commit->parents; p ; p = p->next) {
+	for (struct commit_list *p = commit->parents; p; p = p->next) {
 		struct commit *parent = p->item;
 		fprintf(file, " %s",
 			repo_find_unique_abbrev(the_repository, &parent->object.oid, abbrev));
@@ -487,10 +485,10 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
 		graph_show_oneline(opt->graph);
 	}
 	if (opt->ref_message_ids && opt->ref_message_ids->nr > 0) {
-		int i, n;
+		int n;
 		n = opt->ref_message_ids->nr;
 		fprintf(opt->diffopt.file, "In-Reply-To: <%s>\n", opt->ref_message_ids->items[n-1].string);
-		for (i = 0; i < n; i++)
+		for (int i = 0; i < n; i++)
 			fprintf(opt->diffopt.file, "%s<%s>\n", (i > 0 ? "\t" : "References: "),
 			       opt->ref_message_ids->items[i].string);
 		graph_show_oneline(opt->graph);
diff --git a/ls-refs.c b/ls-refs.c
index 819cbefee3..35453a5f8b 100644
--- a/ls-refs.c
+++ b/ls-refs.c
@@ -51,12 +51,10 @@ static enum {
  */
 static int ref_match(const struct strvec *prefixes, const char *refname)
 {
-	int i;
-
 	if (!prefixes->nr)
 		return 1; /* no restriction */
 
-	for (i = 0; i < prefixes->nr; i++) {
+	for (int i = 0; i < prefixes->nr; i++) {
 		const char *prefix = prefixes->v[i];
 
 		if (starts_with(refname, prefix))
diff --git a/mailinfo.c b/mailinfo.c
index 94b9b0abf2..f37de63ecd 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -8,8 +8,8 @@
 
 static void cleanup_space(struct strbuf *sb)
 {
-	size_t pos, cnt;
-	for (pos = 0; pos < sb->len; pos++) {
+	size_t cnt;
+	for (size_t pos = 0; pos < sb->len; pos++) {
 		if (isspace(sb->buf[pos])) {
 			sb->buf[pos] = ' ';
 			for (cnt = 0; isspace(sb->buf[pos + cnt + 1]); cnt++);
@@ -579,11 +579,11 @@ static int check_header(struct mailinfo *mi,
 			const struct strbuf *line,
 			struct strbuf *hdr_data[], int overwrite)
 {
-	int i, ret = 0;
+	int ret = 0;
 	struct strbuf sb = STRBUF_INIT;
 
 	/* search for the interesting parts */
-	for (i = 0; header[i]; i++) {
+	for (int i = 0; header[i]; i++) {
 		if ((!hdr_data[i] || overwrite) &&
 		    parse_header(line, header[i], mi, &sb)) {
 			handle_header(&hdr_data[i], &sb);
@@ -623,9 +623,8 @@ static int check_header(struct mailinfo *mi,
 static int is_inbody_header(const struct mailinfo *mi,
 			    const struct strbuf *line)
 {
-	int i;
 	const char *val;
-	for (i = 0; header[i]; i++)
+	for (int i = 0; header[i]; i++)
 		if (!mi->s_hdr_data[i] && skip_header(line, header[i], &val))
 			return 1;
 	return 0;
@@ -690,12 +689,11 @@ static inline int patchbreak(const struct strbuf *line)
 
 static int is_scissors_line(const char *line)
 {
-	const char *c;
 	int scissors = 0, gap = 0;
 	const char *first_nonblank = NULL, *last_nonblank = NULL;
 	int visible, perforation = 0, in_perforation = 0;
 
-	for (c = line; *c; c++) {
+	for (const char *c = line; *c; c++) {
 		if (isspace(*c)) {
 			if (in_perforation) {
 				perforation++;
@@ -771,8 +769,7 @@ static int check_inbody_header(struct mailinfo *mi, const struct strbuf *line)
 	if (starts_with(line->buf, ">From") && isspace(line->buf[5]))
 		return is_format_patch_separator(line->buf + 1, line->len - 1);
 	if (starts_with(line->buf, "[PATCH]") && isspace(line->buf[7])) {
-		int i;
-		for (i = 0; header[i]; i++)
+		for (int i = 0; header[i]; i++)
 			if (!strcmp("Subject", header[i])) {
 				handle_header(&mi->s_hdr_data[i], line);
 				return 1;
@@ -815,8 +812,6 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)
 		return 0; /* mi->input_error already set */
 
 	if (mi->use_scissors && is_scissors_line(line->buf)) {
-		int i;
-
 		strbuf_setlen(&mi->log_message, 0);
 		mi->header_stage = 1;
 
@@ -824,7 +819,7 @@ static int handle_commit_msg(struct mailinfo *mi, struct strbuf *line)
 		 * We may have already read "secondary headers"; purge
 		 * them to give ourselves a clean restart.
 		 */
-		for (i = 0; header[i]; i++) {
+		for (int i = 0; header[i]; i++) {
 			if (mi->s_hdr_data[i])
 				strbuf_release(mi->s_hdr_data[i]);
 			FREE_AND_NULL(mi->s_hdr_data[i]);
@@ -1153,9 +1148,7 @@ static void output_header_lines(FILE *fout, const char *hdr, const struct strbuf
 static void handle_info(struct mailinfo *mi)
 {
 	struct strbuf *hdr;
-	int i;
-
-	for (i = 0; header[i]; i++) {
+	for (int i = 0; header[i]; i++) {
 		/* only print inbody headers if we output a patch file */
 		if (mi->patch_lines && mi->s_hdr_data[i])
 			hdr = mi->s_hdr_data[i];
diff --git a/mem-pool.c b/mem-pool.c
index c7d6256020..24ba10f79e 100644
--- a/mem-pool.c
+++ b/mem-pool.c
@@ -135,10 +135,7 @@ char *mem_pool_strndup(struct mem_pool *pool, const char *str, size_t len)
 
 int mem_pool_contains(struct mem_pool *pool, void *mem)
 {
-	struct mp_block *p;
-
-	/* Check if memory is allocated in a block */
-	for (p = pool->mp_block; p; p = p->next_block)
+	for (struct mp_block *p = pool->mp_block; p; p = p->next_block)
 		if ((mem >= ((void *)p->space)) &&
 		    (mem < ((void *)p->end)))
 			return 1;
diff --git a/merge-ll.c b/merge-ll.c
index 61e0ae5398..09fca494a5 100644
--- a/merge-ll.c
+++ b/merge-ll.c
@@ -195,7 +195,7 @@ static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn,
 	struct strbuf cmd = STRBUF_INIT;
 	const char *format = fn->cmdline;
 	struct child_process child = CHILD_PROCESS_INIT;
-	int status, fd, i;
+	int status, fd;
 	struct stat st;
 	enum ll_merge_result ret;
 	assert(opts);
@@ -249,7 +249,7 @@ static enum ll_merge_result ll_ext_merge(const struct ll_merge_driver *fn,
  close_bad:
 	close(fd);
  bad:
-	for (i = 0; i < 3; i++)
+	for (int i = 0; i < 3; i++)
 		unlink_or_warn(temp[i]);
 	strbuf_release(&cmd);
 	if (!status)
@@ -351,9 +351,7 @@ static void initialize_ll_merge(void)
 
 static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr)
 {
-	struct ll_merge_driver *fn;
 	const char *name;
-	int i;
 
 	initialize_ll_merge();
 
@@ -370,11 +368,11 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attr
 	else
 		name = merge_attr;
 
-	for (fn = ll_user_merge; fn; fn = fn->next)
+	for (struct ll_merge_driver *fn = ll_user_merge; fn; fn = fn->next)
 		if (!strcmp(fn->name, name))
 			return fn;
 
-	for (i = 0; i < ARRAY_SIZE(ll_merge_drv); i++)
+	for (int i = 0; i < ARRAY_SIZE(ll_merge_drv); i++)
 		if (!strcmp(ll_merge_drv[i].name, name))
 			return &ll_merge_drv[i];
 
diff --git a/merge-ort.c b/merge-ort.c
index 8617babee4..c1dce9e196 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -937,7 +937,7 @@ static int traverse_trees_wrapper(struct index_state *istate,
 				  struct tree_desc *t,
 				  struct traverse_info *info)
 {
-	int ret, i, old_offset;
+	int ret, old_offset;
 	traverse_callback_t old_fn;
 	char *old_callback_data_traverse_path;
 	struct merge_options *opt = info->data;
@@ -957,7 +957,7 @@ static int traverse_trees_wrapper(struct index_state *istate,
 
 	info->traverse_path = renames->callback_data_traverse_path;
 	info->fn = old_fn;
-	for (i = old_offset; i < renames->callback_data_nr; ++i) {
+	for (int i = old_offset; i < renames->callback_data_nr; ++i) {
 		info->fn(n,
 			 renames->callback_data[i].mask,
 			 renames->callback_data[i].dirmask,
@@ -1003,11 +1003,10 @@ static void setup_path_info(struct merge_options *opt,
 		oidcpy(&mi->result.oid, &merged_version->oid);
 		mi->is_null = !!is_null;
 	} else {
-		int i;
 		struct conflict_info *ci;
 
 		ASSIGN_AND_VERIFY_CI(ci, mi);
-		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+		for (int i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
 			ci->pathnames[i] = fullpath;
 			ci->stages[i].mode = names[i].mode;
 			oidcpy(&ci->stages[i].oid, &names[i].oid);
@@ -1473,11 +1472,11 @@ static int handle_deferred_entries(struct merge_options *opt,
 	struct rename_info *renames = &opt->priv->renames;
 	struct hashmap_iter iter;
 	struct strmap_entry *entry;
-	int side, ret = 0;
+	int ret = 0;
 	int path_count_before, path_count_after = 0;
 
 	path_count_before = strmap_get_size(&opt->priv->paths);
-	for (side = MERGE_SIDE1; side <= MERGE_SIDE2; side++) {
+	for (int side = MERGE_SIDE1; side <= MERGE_SIDE2; side++) {
 		unsigned optimization_okay = 1;
 		struct strintmap copy;
 
@@ -1681,7 +1680,7 @@ static int find_first_merges(struct repository *repo,
 			     struct commit *b,
 			     struct object_array *result)
 {
-	int i, j;
+	int j;
 	struct object_array merges = OBJECT_ARRAY_INIT;
 	struct commit *commit;
 	int contains_another;
@@ -1717,7 +1716,7 @@ static int find_first_merges(struct repository *repo,
 	 * merges that contain another found merge and save them in
 	 * result.
 	 */
-	for (i = 0; i < merges.nr; i++) {
+	for (int i = 0; i < merges.nr; i++) {
 		struct commit *m1 = (struct commit *) merges.objects[i].item;
 
 		contains_another = 0;
@@ -1922,11 +1921,11 @@ static void initialize_attr_index(struct merge_options *opt)
 				ADD_CACHE_OK_TO_ADD | ADD_CACHE_OK_TO_REPLACE);
 		get_stream_filter(attr_index, GITATTRIBUTES_FILE, &ce->oid);
 	} else {
-		int stage, len;
+		int len;
 		struct conflict_info *ci;
 
 		ASSIGN_AND_VERIFY_CI(ci, mi);
-		for (stage = 0; stage < 3; stage++) {
+		for (int stage = 0; stage < 3; stage++) {
 			unsigned stage_mask = (1 << stage);
 
 			if (!(ci->filemask & stage_mask))
@@ -2349,14 +2348,13 @@ static void handle_directory_level_conflicts(struct merge_options *opt)
 	struct rename_info *renames = &opt->priv->renames;
 	struct strmap *side1_dir_renames = &renames->dir_renames[MERGE_SIDE1];
 	struct strmap *side2_dir_renames = &renames->dir_renames[MERGE_SIDE2];
-	int i;
 
 	strmap_for_each_entry(side1_dir_renames, &iter, entry) {
 		if (strmap_contains(side2_dir_renames, entry->key))
 			string_list_append(&duplicated, entry->key);
 	}
 
-	for (i = 0; i < duplicated.nr; i++) {
+	for (int i = 0; i < duplicated.nr; i++) {
 		strmap_remove(side1_dir_renames, duplicated.items[i].string, 0);
 		strmap_remove(side2_dir_renames, duplicated.items[i].string, 0);
 	}
@@ -2384,8 +2382,6 @@ static void compute_collisions(struct strmap *collisions,
 			       struct strmap *dir_renames,
 			       struct diff_queue_struct *pairs)
 {
-	int i;
-
 	strmap_init_with_options(collisions, NULL, 0);
 	if (strmap_empty(dir_renames))
 		return;
@@ -2406,7 +2402,7 @@ static void compute_collisions(struct strmap *collisions,
 	 *
 	 * See testcases 9e and all of section 5 from t6043 for examples.
 	 */
-	for (i = 0; i < pairs->nr; ++i) {
+	for (int i = 0; i < pairs->nr; ++i) {
 		struct strmap_entry *rename_info;
 		struct collision_info *collision_info;
 		char *new_path;
@@ -2733,9 +2729,9 @@ static void apply_directory_rename_modifications(struct merge_options *opt,
 static int process_renames(struct merge_options *opt,
 			   struct diff_queue_struct *renames)
 {
-	int clean_merge = 1, i;
+	int clean_merge = 1;
 
-	for (i = 0; i < renames->nr; ++i) {
+	for (int i = 0; i < renames->nr; ++i) {
 		const char *oldpath = NULL, *newpath;
 		struct diff_filepair *pair = renames->queue[i];
 		struct conflict_info *oldinfo = NULL, *newinfo = NULL;
@@ -3058,14 +3054,9 @@ static inline int possible_renames(struct rename_info *renames)
 
 static void resolve_diffpair_statuses(struct diff_queue_struct *q)
 {
-	/*
-	 * A simplified version of diff_resolve_rename_copy(); would probably
-	 * just use that function but it's static...
-	 */
-	int i;
 	struct diff_filepair *p;
 
-	for (i = 0; i < q->nr; ++i) {
+	for (int i = 0; i < q->nr; ++i) {
 		p = q->queue[i];
 		p->status = 0; /* undecided */
 		if (!DIFF_FILE_VALID(p->one))
@@ -3274,13 +3265,13 @@ static int collect_renames(struct merge_options *opt,
 			   struct strmap *dir_renames_for_side,
 			   struct strmap *rename_exclusions)
 {
-	int i, clean = 1;
+	int clean = 1;
 	struct diff_queue_struct *side_pairs;
 	struct rename_info *renames = &opt->priv->renames;
 
 	side_pairs = &renames->pairs[side_index];
 
-	for (i = 0; i < side_pairs->nr; ++i) {
+	for (int i = 0; i < side_pairs->nr; ++i) {
 		struct diff_filepair *p = side_pairs->queue[i];
 		char *new_path; /* non-NULL only with directory renames */
 
@@ -3342,11 +3333,11 @@ static int detect_and_process_renames(struct merge_options *opt)
 		renames->redo_after_renames = 0;
 	}
 	if (renames->redo_after_renames && detection_run) {
-		int i, side;
+		int i;
 		struct diff_filepair *p;
 
 		/* Cache the renames, we found */
-		for (side = MERGE_SIDE1; side <= MERGE_SIDE2; side++) {
+		for (int side = MERGE_SIDE1; side <= MERGE_SIDE2; side++) {
 			for (i = 0; i < renames->pairs[side].nr; ++i) {
 				p = renames->pairs[side].queue[i];
 				possibly_cache_new_pair(renames, p, side, NULL);
@@ -3852,8 +3843,6 @@ static int process_entry(struct merge_options *opt,
 	}
 
 	if (ci->df_conflict && ci->merged.result.mode == 0) {
-		int i;
-
 		/*
 		 * directory no longer in the way, but we do have a file we
 		 * need to place here so we need to clean away the "directory
@@ -3866,7 +3855,7 @@ static int process_entry(struct merge_options *opt,
 		/* and we want to zero out any directory-related entries */
 		ci->match_mask = (ci->match_mask & ~ci->dirmask);
 		ci->dirmask = 0;
-		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+		for (int i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
 			if (ci->filemask & (1 << i))
 				continue;
 			ci->stages[i].mode = 0;
@@ -3882,7 +3871,6 @@ static int process_entry(struct merge_options *opt,
 		struct conflict_info *new_ci;
 		const char *branch;
 		const char *old_path = path;
-		int i;
 
 		assert(ci->merged.result.mode == S_IFDIR);
 
@@ -3912,7 +3900,7 @@ static int process_entry(struct merge_options *opt,
 		memcpy(new_ci, ci, sizeof(*ci));
 		new_ci->match_mask = (new_ci->match_mask & ~new_ci->dirmask);
 		new_ci->dirmask = 0;
-		for (i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
+		for (int i = MERGE_BASE; i <= MERGE_SIDE2; i++) {
 			if (new_ci->filemask & (1 << i))
 				continue;
 			/* zero out any entries related to directories */
@@ -4201,13 +4189,12 @@ static int process_entry(struct merge_options *opt,
 static void prefetch_for_content_merges(struct merge_options *opt,
 					struct string_list *plist)
 {
-	struct string_list_item *e;
 	struct oid_array to_fetch = OID_ARRAY_INIT;
 
 	if (opt->repo != the_repository || !repo_has_promisor_remote(the_repository))
 		return;
 
-	for (e = &plist->items[plist->nr-1]; e >= plist->items; --e) {
+	for (struct string_list_item *e = &plist->items[plist->nr - 1]; e >= plist->items; --e) {
 		/* char *path = e->string; */
 		struct conflict_info *ci = e->util;
 		int i;
@@ -4252,7 +4239,6 @@ static int process_entries(struct merge_options *opt,
 	struct hashmap_iter iter;
 	struct strmap_entry *e;
 	struct string_list plist = STRING_LIST_INIT_NODUP;
-	struct string_list_item *entry;
 	struct directory_versions dir_metadata = { STRING_LIST_INIT_NODUP,
 						   STRING_LIST_INIT_NODUP,
 						   NULL, 0 };
@@ -4294,7 +4280,7 @@ static int process_entries(struct merge_options *opt,
 	 */
 	trace2_region_enter("merge", "processing", opt->repo);
 	prefetch_for_content_merges(opt, &plist);
-	for (entry = &plist.items[plist.nr-1]; entry >= plist.items; --entry) {
+	for (struct string_list_item *entry = &plist.items[plist.nr - 1]; entry >= plist.items; --entry) {
 		char *path = entry->string;
 		/*
 		 * NOTE: mi may actually be a pointer to a conflict_info, but
@@ -5001,7 +4987,6 @@ static void merge_ort_internal(struct merge_options *opt,
 			       struct commit *h2,
 			       struct merge_result *result)
 {
-	struct commit *next;
 	struct commit *merged_merge_bases;
 	const char *ancestor_name;
 	struct strbuf merge_base_abbrev = STRBUF_INIT;
@@ -5030,8 +5015,7 @@ static void merge_ort_internal(struct merge_options *opt,
 		ancestor_name = merge_base_abbrev.buf;
 	}
 
-	for (next = pop_commit(&merge_bases); next;
-	     next = pop_commit(&merge_bases)) {
+	for (struct commit *next = pop_commit(&merge_bases); next; next = pop_commit(&merge_bases)) {
 		const char *saved_b1, *saved_b2;
 		struct commit *prev = merged_merge_bases;
 
diff --git a/merge-recursive.c b/merge-recursive.c
index a0c3e7a2d9..0786d7e32a 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -527,13 +527,12 @@ static struct stage_data *insert_stage_data(struct repository *r,
 static struct string_list *get_unmerged(struct index_state *istate)
 {
 	struct string_list *unmerged = xmalloc(sizeof(struct string_list));
-	int i;
 
 	string_list_init_dup(unmerged);
 
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(istate);
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct string_list_item *item;
 		struct stage_data *e;
 		const struct cache_entry *ce = istate->cache[i];
@@ -881,11 +880,11 @@ static int was_dirty(struct merge_options *opt, const char *path)
 
 static int make_room_for_path(struct merge_options *opt, const char *path)
 {
-	int status, i;
+	int status;
 	const char *msg = _("failed to create path '%s'%s");
 
 	/* Unlink any D/F conflict files that are in the way */
-	for (i = 0; i < opt->priv->df_conflict_file_set.nr; i++) {
+	for (int i = 0; i < opt->priv->df_conflict_file_set.nr; i++) {
 		const char *df_path = opt->priv->df_conflict_file_set.items[i].string;
 		size_t pathlen = strlen(path);
 		size_t df_pathlen = strlen(df_path);
@@ -1112,7 +1111,7 @@ static int find_first_merges(struct repository *repo,
 			     struct object_array *result, const char *path,
 			     struct commit *a, struct commit *b)
 {
-	int i, j;
+	int j;
 	struct object_array merges = OBJECT_ARRAY_INIT;
 	struct commit *commit;
 	int contains_another;
@@ -1148,7 +1147,7 @@ static int find_first_merges(struct repository *repo,
 	 * merges that contain another found merge and save them in
 	 * result.
 	 */
-	for (i = 0; i < merges.nr; i++) {
+	for (int i = 0; i < merges.nr; i++) {
 		struct commit *m1 = (struct commit *) merges.objects[i].item;
 
 		contains_another = 0;
@@ -2070,10 +2069,9 @@ static void get_renamed_dir_portion(const char *old_path, const char *new_path,
 static void remove_hashmap_entries(struct hashmap *dir_renames,
 				   struct string_list *items_to_remove)
 {
-	int i;
 	struct dir_rename_entry *entry;
 
-	for (i = 0; i < items_to_remove->nr; i++) {
+	for (int i = 0; i < items_to_remove->nr; i++) {
 		entry = items_to_remove->items[i].util;
 		hashmap_remove(dir_renames, &entry->ent, NULL);
 	}
@@ -2386,8 +2384,6 @@ static void compute_collisions(struct hashmap *collisions,
 			       struct hashmap *dir_renames,
 			       struct diff_queue_struct *pairs)
 {
-	int i;
-
 	/*
 	 * Multiple files can be mapped to the same path due to directory
 	 * renames done by the other side of history.  Since that other
@@ -2406,7 +2402,7 @@ static void compute_collisions(struct hashmap *collisions,
 	 */
 	collision_init(collisions);
 
-	for (i = 0; i < pairs->nr; ++i) {
+	for (int i = 0; i < pairs->nr; ++i) {
 		struct dir_rename_entry *dir_rename_ent;
 		struct collision_entry *collision_ent;
 		char *new_path;
@@ -2627,7 +2623,6 @@ static struct string_list *get_renames(struct merge_options *opt,
 				       struct string_list *entries,
 				       int *clean_merge)
 {
-	int i;
 	struct hashmap collisions;
 	struct hashmap_iter iter;
 	struct collision_entry *e;
@@ -2636,7 +2631,7 @@ static struct string_list *get_renames(struct merge_options *opt,
 	compute_collisions(&collisions, dir_renames, pairs);
 	CALLOC_ARRAY(renames, 1);
 
-	for (i = 0; i < pairs->nr; ++i) {
+	for (int i = 0; i < pairs->nr; ++i) {
 		struct string_list_item *item;
 		struct rename *re;
 		struct diff_filepair *pair = pairs->queue[i];
@@ -3000,12 +2995,11 @@ static int detect_and_process_renames(struct merge_options *opt,
 static void final_cleanup_rename(struct string_list *rename)
 {
 	const struct rename *re;
-	int i;
 
 	if (!rename)
 		return;
 
-	for (i = 0; i < rename->nr; i++) {
+	for (int i = 0; i < rename->nr; i++) {
 		re = rename->items[i].util;
 		diff_free_filepair(re->pair);
 	}
@@ -3821,8 +3815,7 @@ int merge_recursive_generic(struct merge_options *opt,
 	struct commit_list *ca = NULL;
 
 	if (merge_bases) {
-		int i;
-		for (i = 0; i < num_merge_bases; ++i) {
+		for (int i = 0; i < num_merge_bases; ++i) {
 			struct commit *base;
 			if (!(base = get_ref(opt->repo, merge_bases[i],
 					     oid_to_hex(merge_bases[i]))))
diff --git a/merge.c b/merge.c
index ca89b312d1..d0a2f1b6ea 100644
--- a/merge.c
+++ b/merge.c
@@ -23,11 +23,11 @@ int try_merge_command(struct repository *r,
 		      const char *head_arg, struct commit_list *remotes)
 {
 	struct child_process cmd = CHILD_PROCESS_INIT;
-	int i, ret;
+	int ret;
 	struct commit_list *j;
 
 	strvec_pushf(&cmd.args, "merge-%s", strategy);
-	for (i = 0; i < xopts_nr; i++)
+	for (int i = 0; i < xopts_nr; i++)
 		strvec_pushf(&cmd.args, "--%s", xopts[i]);
 	for (j = common; j; j = j->next)
 		strvec_push(&cmd.args, merge_argument(j->item));
@@ -55,7 +55,7 @@ int checkout_fast_forward(struct repository *r,
 	struct tree *trees[MAX_UNPACK_TREES];
 	struct unpack_trees_options opts;
 	struct tree_desc t[MAX_UNPACK_TREES];
-	int i, nr_trees = 0;
+	int nr_trees = 0;
 	struct lock_file lock_file = LOCK_INIT;
 
 	refresh_index(r->index, REFRESH_QUIET, NULL, NULL, NULL);
@@ -76,7 +76,7 @@ int checkout_fast_forward(struct repository *r,
 		rollback_lock_file(&lock_file);
 		return -1;
 	}
-	for (i = 0; i < nr_trees; i++) {
+	for (int i = 0; i < nr_trees; i++) {
 		parse_tree(trees[i]);
 		init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
 	}
diff --git a/midx.c b/midx.c
index 85e1c2cd12..ca979b2f0b 100644
--- a/midx.c
+++ b/midx.c
@@ -67,7 +67,6 @@ void get_midx_rev_filename(struct strbuf *out, struct multi_pack_index *m)
 static int midx_read_oid_fanout(const unsigned char *chunk_start,
 				size_t chunk_size, void *data)
 {
-	int i;
 	struct multi_pack_index *m = data;
 	m->chunk_oid_fanout = (uint32_t *)chunk_start;
 
@@ -75,7 +74,7 @@ static int midx_read_oid_fanout(const unsigned char *chunk_start,
 		error(_("multi-pack-index OID fanout is of the wrong size"));
 		return 1;
 	}
-	for (i = 0; i < 255; i++) {
+	for (int i = 0; i < 255; i++) {
 		uint32_t oid_fanout1 = ntohl(m->chunk_oid_fanout[i]);
 		uint32_t oid_fanout2 = ntohl(m->chunk_oid_fanout[i+1]);
 
@@ -124,7 +123,6 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
 	void *midx_map = NULL;
 	uint32_t hash_version;
 	struct strbuf midx_name = STRBUF_INIT;
-	uint32_t i;
 	const char *cur_pack_name;
 	struct chunkfile *cf = NULL;
 
@@ -210,7 +208,7 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
 	CALLOC_ARRAY(m->packs, m->num_packs);
 
 	cur_pack_name = (const char *)m->chunk_pack_names;
-	for (i = 0; i < m->num_packs; i++) {
+	for (uint32_t i = 0; i < m->num_packs; i++) {
 		const char *end;
 		size_t avail = m->chunk_pack_names_len -
 				(cur_pack_name - (const char *)m->chunk_pack_names);
@@ -247,8 +245,6 @@ struct multi_pack_index *load_multi_pack_index(const char *object_dir, int local
 
 void close_midx(struct multi_pack_index *m)
 {
-	uint32_t i;
-
 	if (!m)
 		return;
 
@@ -256,7 +252,7 @@ void close_midx(struct multi_pack_index *m)
 
 	munmap((unsigned char *)m->data, m->data_len);
 
-	for (i = 0; i < m->num_packs; i++) {
+	for (uint32_t i = 0; i < m->num_packs; i++) {
 		if (m->packs[i])
 			m->packs[i]->multi_pack_index = 0;
 	}
@@ -483,13 +479,12 @@ int midx_preferred_pack(struct multi_pack_index *m, uint32_t *pack_int_id)
 int prepare_multi_pack_index_one(struct repository *r, const char *object_dir, int local)
 {
 	struct multi_pack_index *m;
-	struct multi_pack_index *m_search;
 
 	prepare_repo_settings(r);
 	if (!r->settings.core_multi_pack_index)
 		return 0;
 
-	for (m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next)
+	for (struct multi_pack_index *m_search = r->objects->multi_pack_index; m_search; m_search = m_search->next)
 		if (!strcmp(object_dir, m_search->object_dir))
 			return 1;
 
@@ -721,13 +716,12 @@ static void midx_fanout_add_midx_fanout(struct midx_fanout *fanout,
 					int preferred_pack)
 {
 	uint32_t start = 0, end;
-	uint32_t cur_object;
 
 	if (cur_fanout)
 		start = ntohl(m->chunk_oid_fanout[cur_fanout - 1]);
 	end = ntohl(m->chunk_oid_fanout[cur_fanout]);
 
-	for (cur_object = start; cur_object < end; cur_object++) {
+	for (uint32_t cur_object = start; cur_object < end; cur_object++) {
 		if ((preferred_pack > -1) &&
 		    (preferred_pack == nth_midxed_pack_int_id(m, cur_object))) {
 			/*
@@ -754,13 +748,12 @@ static void midx_fanout_add_pack_fanout(struct midx_fanout *fanout,
 {
 	struct packed_git *pack = info[cur_pack].p;
 	uint32_t start = 0, end;
-	uint32_t cur_object;
 
 	if (cur_fanout)
 		start = get_pack_fanout(pack, cur_fanout - 1);
 	end = get_pack_fanout(pack, cur_fanout);
 
-	for (cur_object = start; cur_object < end; cur_object++) {
+	for (uint32_t cur_object = start; cur_object < end; cur_object++) {
 		midx_fanout_grow(fanout, fanout->nr + 1);
 		fill_pack_entry(cur_pack,
 				info[cur_pack].p,
@@ -788,7 +781,7 @@ static struct pack_midx_entry *get_sorted_entries(struct multi_pack_index *m,
 						  size_t *nr_objects,
 						  int preferred_pack)
 {
-	uint32_t cur_fanout, cur_pack, cur_object;
+	uint32_t cur_pack, cur_object;
 	size_t alloc_objects, total_objects = 0;
 	struct midx_fanout fanout = { 0 };
 	struct pack_midx_entry *deduplicated_entries = NULL;
@@ -809,7 +802,7 @@ static struct pack_midx_entry *get_sorted_entries(struct multi_pack_index *m,
 	ALLOC_ARRAY(deduplicated_entries, alloc_objects);
 	*nr_objects = 0;
 
-	for (cur_fanout = 0; cur_fanout < 256; cur_fanout++) {
+	for (uint32_t cur_fanout = 0; cur_fanout < 256; cur_fanout++) {
 		fanout.nr = 0;
 
 		if (m)
@@ -888,9 +881,7 @@ static int write_midx_pack_names(struct hashfile *f, void *data)
 static int write_midx_bitmapped_packs(struct hashfile *f, void *data)
 {
 	struct write_midx_context *ctx = data;
-	size_t i;
-
-	for (i = 0; i < ctx->nr; i++) {
+	for (size_t i = 0; i < ctx->nr; i++) {
 		struct pack_info *pack = &ctx->info[i];
 		if (pack->expired)
 			continue;
@@ -912,14 +903,7 @@ static int write_midx_oid_fanout(struct hashfile *f,
 	struct pack_midx_entry *list = ctx->entries;
 	struct pack_midx_entry *last = ctx->entries + ctx->entries_nr;
 	uint32_t count = 0;
-	uint32_t i;
-
-	/*
-	* Write the first-level table (the list is sorted,
-	* but we use a 256-entry lookup to be able to avoid
-	* having to do eight extra binary search iterations).
-	*/
-	for (i = 0; i < 256; i++) {
+	for (uint32_t i = 0; i < 256; i++) {
 		struct pack_midx_entry *next = list;
 
 		while (next < last && next->oid.hash[0] == i) {
@@ -940,9 +924,7 @@ static int write_midx_oid_lookup(struct hashfile *f,
 	struct write_midx_context *ctx = data;
 	unsigned char hash_len = the_hash_algo->rawsz;
 	struct pack_midx_entry *list = ctx->entries;
-	uint32_t i;
-
-	for (i = 0; i < ctx->entries_nr; i++) {
+	for (uint32_t i = 0; i < ctx->entries_nr; i++) {
 		struct pack_midx_entry *obj = list++;
 
 		if (i < ctx->entries_nr - 1) {
@@ -964,9 +946,9 @@ static int write_midx_object_offsets(struct hashfile *f,
 {
 	struct write_midx_context *ctx = data;
 	struct pack_midx_entry *list = ctx->entries;
-	uint32_t i, nr_large_offset = 0;
+	uint32_t nr_large_offset = 0;
 
-	for (i = 0; i < ctx->entries_nr; i++) {
+	for (uint32_t i = 0; i < ctx->entries_nr; i++) {
 		struct pack_midx_entry *obj = list++;
 
 		if (ctx->pack_perm[obj->pack_int_id] == PACK_EXPIRED)
@@ -1022,9 +1004,7 @@ static int write_midx_revindex(struct hashfile *f,
 			       void *data)
 {
 	struct write_midx_context *ctx = data;
-	uint32_t i;
-
-	for (i = 0; i < ctx->entries_nr; i++)
+	for (uint32_t i = 0; i < ctx->entries_nr; i++)
 		hashwrite_be32(f, ctx->pack_order[i]);
 
 	return 0;
@@ -1124,14 +1104,12 @@ static int midx_checksum_valid(struct multi_pack_index *m)
 static void prepare_midx_packing_data(struct packing_data *pdata,
 				      struct write_midx_context *ctx)
 {
-	uint32_t i;
-
 	trace2_region_enter("midx", "prepare_midx_packing_data", the_repository);
 
 	memset(pdata, 0, sizeof(struct packing_data));
 	prepare_packing_data(the_repository, pdata);
 
-	for (i = 0; i < ctx->entries_nr; i++) {
+	for (uint32_t i = 0; i < ctx->entries_nr; i++) {
 		struct pack_midx_entry *from = &ctx->entries[ctx->pack_order[i]];
 		struct object_entry *to = packlist_alloc(pdata, &from->oid);
 
@@ -1351,14 +1329,13 @@ static struct multi_pack_index *lookup_multi_pack_index(struct repository *r,
 							const char *object_dir)
 {
 	struct multi_pack_index *result = NULL;
-	struct multi_pack_index *cur;
 	char *obj_dir_real = real_pathdup(object_dir, 1);
 	struct strbuf cur_path_real = STRBUF_INIT;
 
 	/* Ensure the given object_dir is local, or a known alternate. */
 	find_odb(r, obj_dir_real);
 
-	for (cur = get_multi_pack_index(r); cur; cur = cur->next) {
+	for (struct multi_pack_index *cur = get_multi_pack_index(r); cur; cur = cur->next) {
 		strbuf_realpath(&cur_path_real, cur->object_dir, 1);
 		if (!strcmp(obj_dir_real, cur_path_real.buf)) {
 			result = cur;
@@ -2070,12 +2047,12 @@ static int fill_included_packs_all(struct repository *r,
 				   struct multi_pack_index *m,
 				   unsigned char *include_pack)
 {
-	uint32_t i, count = 0;
+	uint32_t count = 0;
 	int pack_kept_objects = 0;
 
 	repo_config_get_bool(r, "repack.packkeptobjects", &pack_kept_objects);
 
-	for (i = 0; i < m->num_packs; i++) {
+	for (uint32_t i = 0; i < m->num_packs; i++) {
 		if (prepare_midx_pack(r, m, i))
 			continue;
 		if (!pack_kept_objects && m->packs[i]->pack_keep)
@@ -2159,7 +2136,6 @@ static int fill_included_packs_batch(struct repository *r,
 int midx_repack(struct repository *r, const char *object_dir, size_t batch_size, unsigned flags)
 {
 	int result = 0;
-	uint32_t i;
 	unsigned char *include_pack;
 	struct child_process cmd = CHILD_PROCESS_INIT;
 	FILE *cmd_in;
@@ -2217,7 +2193,7 @@ int midx_repack(struct repository *r, const char *object_dir, size_t batch_size,
 
 	cmd_in = xfdopen(cmd.in, "w");
 
-	for (i = 0; i < m->num_objects; i++) {
+	for (uint32_t i = 0; i < m->num_objects; i++) {
 		struct object_id oid;
 		uint32_t pack_int_id = nth_midxed_pack_int_id(m, i);
 
diff --git a/name-hash.c b/name-hash.c
index 251f036eef..2652c7e4ed 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -233,19 +233,15 @@ static int lookup_lazy_params(struct index_state *istate)
  */
 static void init_dir_mutex(void)
 {
-	int j;
-
 	CALLOC_ARRAY(lazy_dir_mutex_array, LAZY_MAX_MUTEX);
 
-	for (j = 0; j < LAZY_MAX_MUTEX; j++)
+	for (int j = 0; j < LAZY_MAX_MUTEX; j++)
 		init_recursive_mutex(&lazy_dir_mutex_array[j]);
 }
 
 static void cleanup_dir_mutex(void)
 {
-	int j;
-
-	for (j = 0; j < LAZY_MAX_MUTEX; j++)
+	for (int j = 0; j < LAZY_MAX_MUTEX; j++)
 		pthread_mutex_destroy(&lazy_dir_mutex_array[j]);
 
 	free(lazy_dir_mutex_array);
@@ -483,9 +479,7 @@ struct lazy_name_thread_data {
 static void *lazy_name_thread_proc(void *_data)
 {
 	struct lazy_name_thread_data *d = _data;
-	int k;
-
-	for (k = 0; k < d->istate->cache_nr; k++) {
+	for (int k = 0; k < d->istate->cache_nr; k++) {
 		struct cache_entry *ce_k = d->istate->cache[k];
 		ce_k->ce_flags |= CE_HASHED;
 		hashmap_entry_init(&ce_k->ent, d->lazy_entries[k].hash_name);
@@ -499,9 +493,7 @@ static inline void lazy_update_dir_ref_counts(
 	struct index_state *istate,
 	struct lazy_entry *lazy_entries)
 {
-	int k;
-
-	for (k = 0; k < istate->cache_nr; k++) {
+	for (int k = 0; k < istate->cache_nr; k++) {
 		if (lazy_entries[k].dir)
 			lazy_entries[k].dir->nr++;
 	}
@@ -603,8 +595,7 @@ static void lazy_init_name_hash(struct index_state *istate)
 		threaded_lazy_init_name_hash(istate);
 		hashmap_enable_item_counting(&istate->dir_hash);
 	} else {
-		int nr;
-		for (nr = 0; nr < istate->cache_nr; nr++)
+		for (int nr = 0; nr < istate->cache_nr; nr++)
 			hash_index_entry(istate, istate->cache[nr]);
 	}
 
diff --git a/negotiator/skipping.c b/negotiator/skipping.c
index 5b91520430..05006c6286 100644
--- a/negotiator/skipping.c
+++ b/negotiator/skipping.c
@@ -132,7 +132,6 @@ static int push_parent(struct data *data, struct entry *entry,
 	struct entry *parent_entry;
 
 	if (to_push->object.flags & SEEN) {
-		int i;
 		if (to_push->object.flags & POPPED)
 			/*
 			 * The entry for this commit has already been popped,
@@ -143,7 +142,7 @@ static int push_parent(struct data *data, struct entry *entry,
 		/*
 		 * Find the existing entry and use it.
 		 */
-		for (i = 0; i < data->rev_list.nr; i++) {
+		for (int i = 0; i < data->rev_list.nr; i++) {
 			parent_entry = data->rev_list.array[i].data;
 			if (parent_entry->commit == to_push)
 				goto parent_found;
diff --git a/notes-merge.c b/notes-merge.c
index 8799b522a5..580b5acbb5 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -132,7 +132,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
 {
 	struct diff_options opt;
 	struct notes_merge_pair *changes;
-	int i, len = 0;
+	int len = 0;
 
 	trace_printf("\tdiff_tree_remote(base = %.7s, remote = %.7s)\n",
 	       oid_to_hex(base), oid_to_hex(remote));
@@ -146,7 +146,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
 
 	CALLOC_ARRAY(changes, diff_queued_diff.nr);
 
-	for (i = 0; i < diff_queued_diff.nr; i++) {
+	for (int i = 0; i < diff_queued_diff.nr; i++) {
 		struct diff_filepair *p = diff_queued_diff.queue[i];
 		struct notes_merge_pair *mp;
 		int occupied;
@@ -194,7 +194,6 @@ static void diff_tree_local(struct notes_merge_options *o,
 			    const struct object_id *local)
 {
 	struct diff_options opt;
-	int i;
 
 	trace_printf("\tdiff_tree_local(len = %i, base = %.7s, local = %.7s)\n",
 	       len, oid_to_hex(base), oid_to_hex(local));
@@ -206,7 +205,7 @@ static void diff_tree_local(struct notes_merge_options *o,
 	diff_tree_oid(base, local, "", &opt);
 	diffcore_std(&opt);
 
-	for (i = 0; i < diff_queued_diff.nr; i++) {
+	for (int i = 0; i < diff_queued_diff.nr; i++) {
 		struct diff_filepair *p = diff_queued_diff.queue[i];
 		struct notes_merge_pair *mp;
 		int match;
@@ -483,10 +482,10 @@ static int merge_changes(struct notes_merge_options *o,
 			 struct notes_merge_pair *changes, int *num_changes,
 			 struct notes_tree *t)
 {
-	int i, conflicts = 0;
+	int conflicts = 0;
 
 	trace_printf("\tmerge_changes(num_changes = %i)\n", *num_changes);
-	for (i = 0; i < *num_changes; i++) {
+	for (int i = 0; i < *num_changes; i++) {
 		struct notes_merge_pair *p = changes + i;
 		trace_printf("\t\t%.7s: %.7s -> %.7s/%.7s\n",
 		       oid_to_hex(&p->obj), oid_to_hex(&p->base),
diff --git a/notes-utils.c b/notes-utils.c
index 6197a5a455..0bd3557292 100644
--- a/notes-utils.c
+++ b/notes-utils.c
@@ -172,8 +172,7 @@ int copy_note_for_rewrite(struct notes_rewrite_cfg *c,
 			  const struct object_id *from_obj, const struct object_id *to_obj)
 {
 	int ret = 0;
-	int i;
-	for (i = 0; c->trees[i]; i++)
+	for (int i = 0; c->trees[i]; i++)
 		ret = copy_note(c->trees[i], from_obj, to_obj, 1, c->combine) || ret;
 	return ret;
 }
@@ -182,8 +181,7 @@ void finish_copy_notes_for_rewrite(struct repository *r,
 				   struct notes_rewrite_cfg *c,
 				   const char *msg)
 {
-	int i;
-	for (i = 0; c->trees[i]; i++) {
+	for (int i = 0; c->trees[i]; i++) {
 		commit_notes(r, c->trees[i], msg);
 		free_notes(c->trees[i]);
 	}
diff --git a/notes.c b/notes.c
index fed1eda80c..fd09f8597f 100644
--- a/notes.c
+++ b/notes.c
@@ -165,13 +165,12 @@ static struct leaf_node *note_tree_find(struct notes_tree *t,
 static int note_tree_consolidate(struct int_node *tree,
 	struct int_node *parent, unsigned char index)
 {
-	unsigned int i;
 	void *p = NULL;
 
 	assert(tree && parent);
 	assert(CLR_PTR_TYPE(parent->a[index]) == tree);
 
-	for (i = 0; i < 16; i++) {
+	for (unsigned int i = 0; i < 16; i++) {
 		if (GET_PTR_TYPE(tree->a[i]) != PTR_TYPE_NULL) {
 			if (p) /* more than one entry */
 				return -2;
@@ -325,8 +324,7 @@ static int note_tree_insert(struct notes_tree *t, struct int_node *tree,
 /* Free the entire notes data contained in the given tree */
 static void note_tree_free(struct int_node *tree)
 {
-	unsigned int i;
-	for (i = 0; i < 16; i++) {
+	for (unsigned int i = 0; i < 16; i++) {
 		void *p = tree->a[i];
 		switch (GET_PTR_TYPE(p)) {
 		case PTR_TYPE_INTERNAL:
@@ -512,18 +510,9 @@ static void load_subtree(struct notes_tree *t, struct leaf_node *subtree,
 static unsigned char determine_fanout(struct int_node *tree, unsigned char n,
 		unsigned char fanout)
 {
-	/*
-	 * The following is a simple heuristic that works well in practice:
-	 * For each even-numbered 16-tree level (remember that each on-disk
-	 * fanout level corresponds to _two_ 16-tree levels), peek at all 16
-	 * entries at that tree level. If all of them are either int_nodes or
-	 * subtree entries, then there are likely plenty of notes below this
-	 * level, so we return an incremented fanout.
-	 */
-	unsigned int i;
 	if ((n % 2) || (n > 2 * fanout))
 		return fanout;
-	for (i = 0; i < 16; i++) {
+	for (unsigned int i = 0; i < 16; i++) {
 		switch (GET_PTR_TYPE(tree->a[i])) {
 		case PTR_TYPE_SUBTREE:
 		case PTR_TYPE_INTERNAL:
@@ -557,14 +546,13 @@ static int for_each_note_helper(struct notes_tree *t, struct int_node *tree,
 		unsigned char n, unsigned char fanout, int flags,
 		each_note_fn fn, void *cb_data)
 {
-	unsigned int i;
 	void *p;
 	int ret = 0;
 	struct leaf_node *l;
 	static char path[FANOUT_PATH_MAX];
 
 	fanout = determine_fanout(tree, n, fanout);
-	for (i = 0; i < 16; i++) {
+	for (unsigned int i = 0; i < 16; i++) {
 redo:
 		p = tree->a[i];
 		switch (GET_PTR_TYPE(p)) {
@@ -960,12 +948,11 @@ void string_list_add_refs_from_colon_sep(struct string_list *list,
 {
 	struct string_list split = STRING_LIST_INIT_NODUP;
 	char *globs_copy = xstrdup(globs);
-	int i;
 
 	string_list_split_in_place(&split, globs_copy, ":", -1);
 	string_list_remove_empty_items(&split, 0);
 
-	for (i = 0; i < split.nr; i++)
+	for (int i = 0; i < split.nr; i++)
 		string_list_add_refs_by_glob(list, split.items[i].string);
 
 	string_list_clear(&split, 0);
@@ -1257,7 +1244,7 @@ static void format_note(struct notes_tree *t, const struct object_id *object_oid
 {
 	static const char utf8[] = "utf-8";
 	const struct object_id *oid;
-	char *msg, *msg_p;
+	char *msg;
 	unsigned long linelen, msglen;
 	enum object_type type;
 
@@ -1300,7 +1287,7 @@ static void format_note(struct notes_tree *t, const struct object_id *object_oid
 		}
 	}
 
-	for (msg_p = msg; msg_p < msg + msglen; msg_p += linelen + 1) {
+	for (char *msg_p = msg; msg_p < msg + msglen; msg_p += linelen + 1) {
 		linelen = strchrnul(msg_p, '\n') - msg_p;
 
 		if (!raw)
@@ -1315,9 +1302,8 @@ static void format_note(struct notes_tree *t, const struct object_id *object_oid
 void format_display_notes(const struct object_id *object_oid,
 			  struct strbuf *sb, const char *output_encoding, int raw)
 {
-	int i;
 	assert(display_notes_trees);
-	for (i = 0; display_notes_trees[i]; i++)
+	for (int i = 0; display_notes_trees[i]; i++)
 		format_note(display_notes_trees[i], object_oid, sb,
 			    output_encoding, raw);
 }
diff --git a/object-file.c b/object-file.c
index 619f039ebc..7bc32ce778 100644
--- a/object-file.c
+++ b/object-file.c
@@ -239,10 +239,9 @@ const char *empty_blob_oid_hex(void)
 
 int hash_algo_by_name(const char *name)
 {
-	int i;
 	if (!name)
 		return GIT_HASH_UNKNOWN;
-	for (i = 1; i < GIT_HASH_NALGOS; i++)
+	for (int i = 1; i < GIT_HASH_NALGOS; i++)
 		if (!strcmp(name, hash_algos[i].name))
 			return i;
 	return GIT_HASH_UNKNOWN;
@@ -250,8 +249,7 @@ int hash_algo_by_name(const char *name)
 
 int hash_algo_by_id(uint32_t format_id)
 {
-	int i;
-	for (i = 1; i < GIT_HASH_NALGOS; i++)
+	for (int i = 1; i < GIT_HASH_NALGOS; i++)
 		if (format_id == hash_algos[i].format_id)
 			return i;
 	return GIT_HASH_UNKNOWN;
@@ -259,8 +257,7 @@ int hash_algo_by_id(uint32_t format_id)
 
 int hash_algo_by_length(int len)
 {
-	int i;
-	for (i = 1; i < GIT_HASH_NALGOS; i++)
+	for (int i = 1; i < GIT_HASH_NALGOS; i++)
 		if (len == hash_algos[i].rawsz)
 			return i;
 	return GIT_HASH_UNKNOWN;
@@ -290,10 +287,9 @@ static struct cached_object empty_tree = {
 
 static struct cached_object *find_cached_object(const struct object_id *oid)
 {
-	int i;
 	struct cached_object *co = cached_objects;
 
-	for (i = 0; i < cached_object_nr; i++, co++) {
+	for (int i = 0; i < cached_object_nr; i++, co++) {
 		if (oideq(&co->oid, oid))
 			return co;
 	}
@@ -422,8 +418,7 @@ enum scld_error safe_create_leading_directories_const(const char *path)
 
 static void fill_loose_path(struct strbuf *buf, const struct object_id *oid)
 {
-	int i;
-	for (i = 0; i < the_hash_algo->rawsz; i++) {
+	for (int i = 0; i < the_hash_algo->rawsz; i++) {
 		static char hex[] = "0123456789abcdef";
 		unsigned int val = oid->hash[i];
 		strbuf_addch(buf, hex[val >> 4]);
@@ -922,11 +917,10 @@ void for_each_alternate_ref(alternate_ref_fn fn, void *data)
 
 int foreach_alt_odb(alt_odb_fn fn, void *cb)
 {
-	struct object_directory *ent;
 	int r = 0;
 
 	prepare_alt_odb(the_repository);
-	for (ent = the_repository->objects->odb->next; ent; ent = ent->next) {
+	for (struct object_directory *ent = the_repository->objects->odb->next; ent; ent = ent->next) {
 		r = fn(ent, cb);
 		if (r)
 			break;
@@ -989,10 +983,8 @@ static int check_and_freshen_local(const struct object_id *oid, int freshen)
 
 static int check_and_freshen_nonlocal(const struct object_id *oid, int freshen)
 {
-	struct object_directory *odb;
-
 	prepare_alt_odb(the_repository);
-	for (odb = the_repository->objects->odb->next; odb; odb = odb->next) {
+	for (struct object_directory *odb = the_repository->objects->odb->next; odb; odb = odb->next) {
 		if (check_and_freshen_odb(odb, oid, freshen))
 			return 1;
 	}
@@ -1166,11 +1158,10 @@ int git_open_cloexec(const char *name, int flags)
 static int stat_loose_object(struct repository *r, const struct object_id *oid,
 			     struct stat *st, const char **path)
 {
-	struct object_directory *odb;
 	static struct strbuf buf = STRBUF_INIT;
 
 	prepare_alt_odb(r);
-	for (odb = r->objects->odb; odb; odb = odb->next) {
+	for (struct object_directory *odb = r->objects->odb; odb; odb = odb->next) {
 		*path = odb_loose_path(odb, &buf, oid);
 		if (!lstat(*path, st))
 			return 0;
@@ -1187,12 +1178,11 @@ static int open_loose_object(struct repository *r,
 			     const struct object_id *oid, const char **path)
 {
 	int fd;
-	struct object_directory *odb;
 	int most_interesting_errno = ENOENT;
 	static struct strbuf buf = STRBUF_INIT;
 
 	prepare_alt_odb(r);
-	for (odb = r->objects->odb; odb; odb = odb->next) {
+	for (struct object_directory *odb = r->objects->odb; odb; odb = odb->next) {
 		*path = odb_loose_path(odb, &buf, oid);
 		fd = git_open(*path);
 		if (fd >= 0)
@@ -1208,10 +1198,8 @@ static int open_loose_object(struct repository *r,
 static int quick_has_loose(struct repository *r,
 			   const struct object_id *oid)
 {
-	struct object_directory *odb;
-
 	prepare_alt_odb(r);
-	for (odb = r->objects->odb; odb; odb = odb->next) {
+	for (struct object_directory *odb = r->objects->odb; odb; odb = odb->next) {
 		if (oidtree_contains(odb_loose_cache(odb, oid), oid))
 			return 1;
 	}
@@ -2603,9 +2591,7 @@ int for_each_loose_file_in_objdir_buf(struct strbuf *path,
 			    void *data)
 {
 	int r = 0;
-	int i;
-
-	for (i = 0; i < 256; i++) {
+	for (int i = 0; i < 256; i++) {
 		r = for_each_file_in_obj_subdir(i, path, obj_cb, cruft_cb,
 						subdir_cb, data);
 		if (r)
@@ -2635,10 +2621,8 @@ int for_each_loose_file_in_objdir(const char *path,
 int for_each_loose_object(each_loose_object_fn cb, void *data,
 			  enum for_each_object_flags flags)
 {
-	struct object_directory *odb;
-
 	prepare_alt_odb(the_repository);
-	for (odb = the_repository->objects->odb; odb; odb = odb->next) {
+	for (struct object_directory *odb = the_repository->objects->odb; odb; odb = odb->next) {
 		int r = for_each_loose_file_in_objdir(odb->path, cb, NULL,
 						      NULL, data);
 		if (r)
diff --git a/object-name.c b/object-name.c
index 3a2ef5d680..a8a29a8c8b 100644
--- a/object-name.c
+++ b/object-name.c
@@ -105,9 +105,7 @@ static enum cb_next match_prefix(const struct object_id *oid, void *arg)
 
 static void find_short_object_filename(struct disambiguate_state *ds)
 {
-	struct object_directory *odb;
-
-	for (odb = ds->repo->objects->odb; odb && !ds->ambiguous; odb = odb->next)
+	for (struct object_directory *odb = ds->repo->objects->odb; odb && !ds->ambiguous; odb = odb->next)
 		oidtree_each(odb_loose_cache(odb, &ds->bin_pfx),
 				&ds->bin_pfx, ds->len, match_prefix, ds);
 }
@@ -130,7 +128,7 @@ static int match_hash(unsigned len, const unsigned char *a, const unsigned char
 static void unique_in_midx(struct multi_pack_index *m,
 			   struct disambiguate_state *ds)
 {
-	uint32_t num, i, first = 0;
+	uint32_t num, first = 0;
 	const struct object_id *current = NULL;
 	num = m->num_objects;
 
@@ -144,7 +142,7 @@ static void unique_in_midx(struct multi_pack_index *m,
 	 * with an object name that could match "bin_pfx".  See if we have
 	 * 0, 1 or more objects that actually match(es).
 	 */
-	for (i = first; i < num && !ds->ambiguous; i++) {
+	for (uint32_t i = first; i < num && !ds->ambiguous; i++) {
 		struct object_id oid;
 		current = nth_midxed_object_oid(&oid, m, i);
 		if (!match_hash(ds->len, ds->bin_pfx.hash, current->hash))
@@ -156,7 +154,7 @@ static void unique_in_midx(struct multi_pack_index *m,
 static void unique_in_pack(struct packed_git *p,
 			   struct disambiguate_state *ds)
 {
-	uint32_t num, i, first = 0;
+	uint32_t num, first = 0;
 
 	if (p->multi_pack_index)
 		return;
@@ -172,7 +170,7 @@ static void unique_in_pack(struct packed_git *p,
 	 * with an object name that could match "bin_pfx".  See if we have
 	 * 0, 1 or more objects that actually match(es).
 	 */
-	for (i = first; i < num && !ds->ambiguous; i++) {
+	for (uint32_t i = first; i < num && !ds->ambiguous; i++) {
 		struct object_id oid;
 		nth_packed_object_id(&oid, p, i);
 		if (!match_hash(ds->len, ds->bin_pfx.hash, oid.hash))
@@ -183,14 +181,9 @@ static void unique_in_pack(struct packed_git *p,
 
 static void find_short_packed_object(struct disambiguate_state *ds)
 {
-	struct multi_pack_index *m;
-	struct packed_git *p;
-
-	for (m = get_multi_pack_index(ds->repo); m && !ds->ambiguous;
-	     m = m->next)
+	for (struct multi_pack_index *m = get_multi_pack_index(ds->repo); m && !ds->ambiguous; m = m->next)
 		unique_in_midx(m, ds);
-	for (p = get_packed_git(ds->repo); p && !ds->ambiguous;
-	     p = p->next)
+	for (struct packed_git *p = get_packed_git(ds->repo); p && !ds->ambiguous; p = p->next)
 		unique_in_pack(p, ds);
 }
 
@@ -307,12 +300,11 @@ int set_disambiguate_hint_config(const char *var, const char *value)
 		{ "treeish", disambiguate_treeish_only },
 		{ "blob", disambiguate_blob_only }
 	};
-	int i;
 
 	if (!value)
 		return config_error_nonbool(var);
 
-	for (i = 0; i < ARRAY_SIZE(hints); i++) {
+	for (int i = 0; i < ARRAY_SIZE(hints); i++) {
 		if (!strcasecmp(value, hints[i].name)) {
 			default_disambiguate_hint = hints[i].fn;
 			return 0;
@@ -326,14 +318,12 @@ static int init_object_disambiguation(struct repository *r,
 				      const char *name, int len,
 				      struct disambiguate_state *ds)
 {
-	int i;
-
 	if (len < MINIMUM_ABBREV || len > the_hash_algo->hexsz)
 		return -1;
 
 	memset(ds, 0, sizeof(*ds));
 
-	for (i = 0; i < len ;i++) {
+	for (int i = 0; i < len; i++) {
 		unsigned char c = name[i];
 		unsigned char val;
 		if (c >= '0' && c <= '9')
@@ -758,12 +748,9 @@ static void find_abbrev_len_for_pack(struct packed_git *p,
 
 static void find_abbrev_len_packed(struct min_abbrev_data *mad)
 {
-	struct multi_pack_index *m;
-	struct packed_git *p;
-
-	for (m = get_multi_pack_index(mad->repo); m; m = m->next)
+	for (struct multi_pack_index *m = get_multi_pack_index(mad->repo); m; m = m->next)
 		find_abbrev_len_for_midx(m, mad);
-	for (p = get_packed_git(mad->repo); p; p = p->next)
+	for (struct packed_git *p = get_packed_git(mad->repo); p; p = p->next)
 		find_abbrev_len_for_pack(p, mad);
 }
 
@@ -853,9 +840,7 @@ const char *repo_find_unique_abbrev(struct repository *r,
 static int ambiguous_path(const char *path, int len)
 {
 	int slash = 1;
-	int cnt;
-
-	for (cnt = 0; cnt < len; cnt++) {
+	for (int cnt = 0; cnt < len; cnt++) {
 		switch (*path++) {
 		case '\0':
 			break;
@@ -878,9 +863,7 @@ static int ambiguous_path(const char *path, int len)
 static inline int at_mark(const char *string, int len,
 			  const char **suffix, int nr)
 {
-	int i;
-
-	for (i = 0; i < nr; i++) {
+	for (int i = 0; i < nr; i++) {
 		int suffix_len = strlen(suffix[i]);
 		if (suffix_len <= len
 		    && !strncasecmp(string, suffix[i], suffix_len))
@@ -992,13 +975,13 @@ static int get_oid_basic(struct repository *r, const char *str, int len,
 		warning(warn_msg, len, str);
 
 	if (reflog_len) {
-		int nth, i;
+		int nth;
 		timestamp_t at_time;
 		timestamp_t co_time;
 		int co_tz, co_cnt;
 
 		/* Is it asking for N-th entry, or approxidate? */
-		for (i = nth = 0; 0 <= nth && i < reflog_len; i++) {
+		for (int i = nth = 0; 0 <= nth && i < reflog_len; i++) {
 			char ch = str[at+2+i];
 			if ('0' <= ch && ch <= '9')
 				nth = nth * 10 + ch - '0';
@@ -1229,10 +1212,9 @@ static int get_describe_name(struct repository *r,
 			     const char *name, int len,
 			     struct object_id *oid)
 {
-	const char *cp;
 	unsigned flags = GET_OID_QUIETLY | GET_OID_COMMIT;
 
-	for (cp = name + len - 1; name + 2 <= cp; cp--) {
+	for (const char *cp = name + len - 1; name + 2 <= cp; cp--) {
 		char ch = *cp;
 		if (!isxdigit(ch)) {
 			/* We must be looking at g in "SOMETHING-g"
@@ -1639,7 +1621,6 @@ int repo_interpret_branch_name(struct repository *r,
 			       const struct interpret_branch_name_options *options)
 {
 	char *at;
-	const char *start;
 	int len;
 
 	if (!namelen)
@@ -1658,9 +1639,7 @@ int repo_interpret_branch_name(struct repository *r,
 		}
 	}
 
-	for (start = name;
-	     (at = memchr(start, '@', namelen - (start - name)));
-	     start = at + 1) {
+	for (const char *start = name; (at = memchr(start, '@', namelen - (start - name))); start = at + 1) {
 
 		if (!options->allowed || (options->allowed & INTERPRET_BRANCH_HEAD)) {
 			len = interpret_empty_at(name, namelen, at - name, buf);
diff --git a/object.c b/object.c
index e6a1c4d905..90ebd3b111 100644
--- a/object.c
+++ b/object.c
@@ -41,12 +41,10 @@ const char *type_name(unsigned int type)
 
 int type_from_string_gently(const char *str, ssize_t len, int gentle)
 {
-	int i;
-
 	if (len < 0)
 		len = strlen(str);
 
-	for (i = 1; i < ARRAY_SIZE(object_type_strings); i++)
+	for (int i = 1; i < ARRAY_SIZE(object_type_strings); i++)
 		if (!xstrncmpz(object_type_strings[i], str, len))
 			return i;
 
@@ -122,7 +120,6 @@ struct object *lookup_object(struct repository *r, const struct object_id *oid)
  */
 static void grow_object_hash(struct repository *r)
 {
-	int i;
 	/*
 	 * Note that this size must always be power-of-2 to match hash_obj
 	 * above.
@@ -131,7 +128,7 @@ static void grow_object_hash(struct repository *r)
 	struct object **new_hash;
 
 	CALLOC_ARRAY(new_hash, new_hash_size);
-	for (i = 0; i < r->parsed_objects->obj_hash_size; i++) {
+	for (int i = 0; i < r->parsed_objects->obj_hash_size; i++) {
 		struct object *obj = r->parsed_objects->obj_hash[i];
 
 		if (!obj)
@@ -426,10 +423,10 @@ struct object *object_array_pop(struct object_array *array)
 void object_array_filter(struct object_array *array,
 			 object_array_each_func_t want, void *cb_data)
 {
-	unsigned nr = array->nr, src, dst;
+	unsigned nr = array->nr, dst;
 	struct object_array_entry *objects = array->objects;
 
-	for (src = dst = 0; src < nr; src++) {
+	for (unsigned src = dst = 0; src < nr; src++) {
 		if (want(&objects[src], cb_data)) {
 			if (src != dst)
 				objects[dst] = objects[src];
@@ -443,8 +440,7 @@ void object_array_filter(struct object_array *array,
 
 void object_array_clear(struct object_array *array)
 {
-	int i;
-	for (i = 0; i < array->nr; i++)
+	for (int i = 0; i < array->nr; i++)
 		object_array_release_entry(&array->objects[i]);
 	FREE_AND_NULL(array->objects);
 	array->nr = array->alloc = 0;
@@ -456,10 +452,10 @@ void object_array_clear(struct object_array *array)
 static int contains_object(struct object_array *array,
 			   const struct object *item, const char *name)
 {
-	unsigned nr = array->nr, i;
+	unsigned nr = array->nr;
 	struct object_array_entry *object = array->objects;
 
-	for (i = 0; i < nr; i++, object++)
+	for (unsigned i = 0; i < nr; i++, object++)
 		if (item == object->item && !strcmp(object->name, name))
 			return 1;
 	return 0;
@@ -467,11 +463,11 @@ static int contains_object(struct object_array *array,
 
 void object_array_remove_duplicates(struct object_array *array)
 {
-	unsigned nr = array->nr, src;
+	unsigned nr = array->nr;
 	struct object_array_entry *objects = array->objects;
 
 	array->nr = 0;
-	for (src = 0; src < nr; src++) {
+	for (unsigned src = 0; src < nr; src++) {
 		if (!contains_object(array, objects[src].item,
 				     objects[src].name)) {
 			if (src != array->nr)
@@ -485,9 +481,7 @@ void object_array_remove_duplicates(struct object_array *array)
 
 void clear_object_flags(unsigned flags)
 {
-	int i;
-
-	for (i=0; i < the_repository->parsed_objects->obj_hash_size; i++) {
+	for (int i = 0; i < the_repository->parsed_objects->obj_hash_size; i++) {
 		struct object *obj = the_repository->parsed_objects->obj_hash[i];
 		if (obj)
 			obj->flags &= ~flags;
@@ -496,9 +490,7 @@ void clear_object_flags(unsigned flags)
 
 void repo_clear_commit_marks(struct repository *r, unsigned int flags)
 {
-	int i;
-
-	for (i = 0; i < r->parsed_objects->obj_hash_size; i++) {
+	for (int i = 0; i < r->parsed_objects->obj_hash_size; i++) {
 		struct object *obj = r->parsed_objects->obj_hash[i];
 		if (obj && obj->type == OBJ_COMMIT)
 			obj->flags &= ~flags;
@@ -579,17 +571,7 @@ void raw_object_store_clear(struct raw_object_store *o)
 }
 
 void parsed_object_pool_clear(struct parsed_object_pool *o)
-{
-	/*
-	 * As objects are allocated in slabs (see alloc.c), we do
-	 * not need to free each object, but each slab instead.
-	 *
-	 * Before doing so, we need to free any additional memory
-	 * the objects may hold.
-	 */
-	unsigned i;
-
-	for (i = 0; i < o->obj_hash_size; i++) {
+{for (unsigned i = 0; i < o->obj_hash_size; i++) {
 		struct object *obj = o->obj_hash[i];
 
 		if (!obj)
diff --git a/oid-array.c b/oid-array.c
index 8e4717746c..bda80c1e49 100644
--- a/oid-array.c
+++ b/oid-array.c
@@ -47,11 +47,7 @@ int oid_array_for_each(struct oid_array *array,
 		       for_each_oid_fn fn,
 		       void *data)
 {
-	size_t i;
-
-	/* No oid_array_sort() here! See oid-array.h */
-
-	for (i = 0; i < array->nr; i++) {
+	for (size_t i = 0; i < array->nr; i++) {
 		int ret = fn(array->oid + i, data);
 		if (ret)
 			return ret;
@@ -63,11 +59,9 @@ int oid_array_for_each_unique(struct oid_array *array,
 			      for_each_oid_fn fn,
 			      void *data)
 {
-	size_t i;
-
 	oid_array_sort(array);
 
-	for (i = 0; i < array->nr; i = oid_array_next_unique(array, i)) {
+	for (size_t i = 0; i < array->nr; i = oid_array_next_unique(array, i)) {
 		int ret = fn(array->oid + i, data);
 		if (ret)
 			return ret;
@@ -79,10 +73,10 @@ void oid_array_filter(struct oid_array *array,
 		      for_each_oid_fn want,
 		      void *cb_data)
 {
-	size_t nr = array->nr, src, dst;
+	size_t nr = array->nr, dst;
 	struct object_id *oids = array->oid;
 
-	for (src = dst = 0; src < nr; src++) {
+	for (size_t src = dst = 0; src < nr; src++) {
 		if (want(&oids[src], cb_data)) {
 			if (src != dst)
 				oidcpy(&oids[dst], &oids[src]);
diff --git a/pack-bitmap-write.c b/pack-bitmap-write.c
index 990a9498d7..795a6fd6ba 100644
--- a/pack-bitmap-write.c
+++ b/pack-bitmap-write.c
@@ -58,15 +58,13 @@ void bitmap_writer_build_type_index(struct packing_data *to_pack,
 				    struct pack_idx_entry **index,
 				    uint32_t index_nr)
 {
-	uint32_t i;
-
 	writer.commits = ewah_new();
 	writer.trees = ewah_new();
 	writer.blobs = ewah_new();
 	writer.tags = ewah_new();
 	ALLOC_ARRAY(to_pack->in_pack_pos, to_pack->nr_objects);
 
-	for (i = 0; i < index_nr; ++i) {
+	for (uint32_t i = 0; i < index_nr; ++i) {
 		struct object_entry *entry = (struct object_entry *)index[i];
 		enum object_type real_type;
 
@@ -217,8 +215,7 @@ static void bitmap_builder_init(struct bitmap_builder *bb,
 	struct rev_info revs;
 	struct commit *commit;
 	struct commit_list *reusable = NULL;
-	struct commit_list *r;
-	unsigned int i, num_maximal = 0;
+	unsigned int num_maximal = 0;
 
 	memset(bb, 0, sizeof(*bb));
 	init_bb_data(&bb->data);
@@ -228,7 +225,7 @@ static void bitmap_builder_init(struct bitmap_builder *bb,
 	revs.topo_order = 1;
 	revs.first_parent_only = 1;
 
-	for (i = 0; i < writer->selected_nr; i++) {
+	for (unsigned int i = 0; i < writer->selected_nr; i++) {
 		struct commit *c = writer->selected[i].commit;
 		struct bb_commit *ent = bb_data_at(&bb->data, c);
 
@@ -327,7 +324,7 @@ static void bitmap_builder_init(struct bitmap_builder *bb,
 		c_ent->commit_mask = NULL;
 	}
 
-	for (r = reusable; r; r = r->next) {
+	for (struct commit_list *r = reusable; r; r = r->next) {
 		ALLOC_GROW(bb->commits, bb->commits_nr + 1, bb->commits_alloc);
 		bb->commits[bb->commits_nr++] = r->item;
 	}
@@ -480,7 +477,6 @@ static void store_selected(struct bb_commit *ent, struct commit *commit)
 int bitmap_writer_build(struct packing_data *to_pack)
 {
 	struct bitmap_builder bb;
-	size_t i;
 	int nr_stored = 0; /* for progress */
 	struct prio_queue queue = { compare_commits_by_gen_then_commit_date };
 	struct prio_queue tree_queue = { NULL };
@@ -503,7 +499,7 @@ int bitmap_writer_build(struct packing_data *to_pack)
 		mapping = NULL;
 
 	bitmap_builder_init(&bb, &writer, old_bitmap);
-	for (i = bb.commits_nr; i > 0; i--) {
+	for (size_t i = bb.commits_nr; i > 0; i--) {
 		struct commit *commit = bb.commits[i-1];
 		struct bb_commit *ent = bb_data_at(&bb.data, commit);
 		struct commit *child;
@@ -674,9 +670,7 @@ static void write_selected_commits_v1(struct hashfile *f,
 				      uint32_t *commit_positions,
 				      off_t *offsets)
 {
-	int i;
-
-	for (i = 0; i < writer.selected_nr; ++i) {
+	for (int i = 0; i < writer.selected_nr; ++i) {
 		struct bitmapped_commit *stored = &writer.selected[i];
 
 		if (offsets)
@@ -767,9 +761,7 @@ static void write_hash_cache(struct hashfile *f,
 			     struct pack_idx_entry **index,
 			     uint32_t index_nr)
 {
-	uint32_t i;
-
-	for (i = 0; i < index_nr; ++i) {
+	for (uint32_t i = 0; i < index_nr; ++i) {
 		struct object_entry *entry = (struct object_entry *)index[i];
 		hashwrite_be32(f, entry->hash);
 	}
@@ -791,7 +783,6 @@ void bitmap_writer_finish(struct pack_idx_entry **index,
 	struct hashfile *f;
 	uint32_t *commit_positions = NULL;
 	off_t *offsets = NULL;
-	uint32_t i;
 
 	struct bitmap_disk_header header;
 
@@ -816,7 +807,7 @@ void bitmap_writer_finish(struct pack_idx_entry **index,
 
 	ALLOC_ARRAY(commit_positions, writer.selected_nr);
 
-	for (i = 0; i < writer.selected_nr; i++) {
+	for (uint32_t i = 0; i < writer.selected_nr; i++) {
 		struct bitmapped_commit *stored = &writer.selected[i];
 		int commit_pos = oid_pos(&stored->commit->object.oid, index, index_nr, oid_access);
 
diff --git a/pack-bitmap.c b/pack-bitmap.c
index 2baeabacee..f1958d12c2 100644
--- a/pack-bitmap.c
+++ b/pack-bitmap.c
@@ -264,10 +264,9 @@ static int nth_bitmap_object_oid(struct bitmap_index *index,
 
 static int load_bitmap_entries_v1(struct bitmap_index *index)
 {
-	uint32_t i;
 	struct stored_bitmap *recent_bitmaps[MAX_XOR_OFFSET] = { NULL };
 
-	for (i = 0; i < index->entry_count; ++i) {
+	for (uint32_t i = 0; i < index->entry_count; ++i) {
 		int xor_offset, flags;
 		struct ewah_bitmap *bitmap = NULL;
 		struct stored_bitmap *xor_bitmap = NULL;
@@ -331,7 +330,7 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,
 	struct stat st;
 	char *bitmap_name = midx_bitmap_filename(midx);
 	int fd = git_open(bitmap_name);
-	uint32_t i, preferred_pack;
+	uint32_t preferred_pack;
 	struct packed_git *preferred;
 
 	if (fd < 0) {
@@ -378,7 +377,7 @@ static int open_midx_bitmap_1(struct bitmap_index *bitmap_git,
 		goto cleanup;
 	}
 
-	for (i = 0; i < bitmap_git->midx->num_packs; i++) {
+	for (uint32_t i = 0; i < bitmap_git->midx->num_packs; i++) {
 		if (prepare_midx_pack(the_repository, bitmap_git->midx, i)) {
 			warning(_("could not open pack %s"),
 				bitmap_git->midx->pack_names[i]);
@@ -467,7 +466,6 @@ static int open_pack_bitmap_1(struct bitmap_index *bitmap_git, struct packed_git
 static int load_reverse_index(struct repository *r, struct bitmap_index *bitmap_git)
 {
 	if (bitmap_is_midx(bitmap_git)) {
-		uint32_t i;
 		int ret;
 
 		/*
@@ -477,7 +475,7 @@ static int load_reverse_index(struct repository *r, struct bitmap_index *bitmap_
 		 * But we still need to open the individual pack .rev files,
 		 * since we will need to make use of them in pack-objects.
 		 */
-		for (i = 0; i < bitmap_git->midx->num_packs; i++) {
+		for (uint32_t i = 0; i < bitmap_git->midx->num_packs; i++) {
 			ret = load_pack_revindex(r, bitmap_git->midx->packs[i]);
 			if (ret)
 				return ret;
@@ -525,10 +523,9 @@ static int load_bitmap(struct repository *r, struct bitmap_index *bitmap_git)
 static int open_pack_bitmap(struct repository *r,
 			    struct bitmap_index *bitmap_git)
 {
-	struct packed_git *p;
 	int ret = -1;
 
-	for (p = get_all_packs(r); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(r); p; p = p->next) {
 		if (open_pack_bitmap_1(bitmap_git, p) == 0) {
 			ret = 0;
 			/*
@@ -547,11 +544,10 @@ static int open_midx_bitmap(struct repository *r,
 			    struct bitmap_index *bitmap_git)
 {
 	int ret = -1;
-	struct multi_pack_index *midx;
 
 	assert(!bitmap_git->map);
 
-	for (midx = get_multi_pack_index(r); midx; midx = midx->next) {
+	for (struct multi_pack_index *midx = get_multi_pack_index(r); midx; midx = midx->next) {
 		if (!open_midx_bitmap_1(bitmap_git, midx))
 			ret = 0;
 	}
@@ -1111,8 +1107,6 @@ static struct bitmap *find_boundary_objects(struct bitmap_index *bitmap_git,
 					    struct object_list *roots)
 {
 	struct bitmap_boundary_cb cb;
-	struct object_list *root;
-	unsigned int i;
 	unsigned int tmp_blobs, tmp_trees, tmp_tags;
 	int any_missing = 0;
 
@@ -1126,7 +1120,7 @@ static struct bitmap *find_boundary_objects(struct bitmap_index *bitmap_git,
 	 * OR in any existing reachability bitmaps among `roots` into
 	 * `cb.base`.
 	 */
-	for (root = roots; root; root = root->next) {
+	for (struct object_list *root = roots; root; root = root->next) {
 		struct object *object = root->item;
 		if (object->type != OBJ_COMMIT ||
 		    bitmap_walk_contains(bitmap_git, cb.base, &object->oid))
@@ -1179,7 +1173,7 @@ static struct bitmap *find_boundary_objects(struct bitmap_index *bitmap_git,
 	 * Then add the boundary commit(s) as fill-in traversal tips.
 	 */
 	trace2_region_enter("pack-bitmap", "boundary-fill-in", the_repository);
-	for (i = 0; i < cb.boundary.nr; i++) {
+	for (unsigned int i = 0; i < cb.boundary.nr; i++) {
 		struct object *obj = cb.boundary.objects[i].item;
 		if (bitmap_walk_contains(bitmap_git, cb.base, &obj->oid))
 			obj->flags |= SEEN;
@@ -1289,9 +1283,7 @@ static void show_extended_objects(struct bitmap_index *bitmap_git,
 {
 	struct bitmap *objects = bitmap_git->result;
 	struct eindex *eindex = &bitmap_git->ext_index;
-	uint32_t i;
-
-	for (i = 0; i < eindex->count; ++i) {
+	for (uint32_t i = 0; i < eindex->count; ++i) {
 		struct object *obj;
 
 		if (!bitmap_get(objects, st_add(bitmap_num_objects(bitmap_git), i)))
@@ -1418,9 +1410,7 @@ static struct bitmap *find_tip_objects(struct bitmap_index *bitmap_git,
 				       enum object_type type)
 {
 	struct bitmap *result = bitmap_new();
-	struct object_list *p;
-
-	for (p = tip_objects; p; p = p->next) {
+	for (struct object_list *p = tip_objects; p; p = p->next) {
 		int pos;
 
 		if (p->item->type != type)
@@ -1648,8 +1638,7 @@ static int filter_bitmap(struct bitmap_index *bitmap_git,
 	}
 
 	if (filter->choice == LOFC_COMBINE) {
-		int i;
-		for (i = 0; i < filter->sub_nr; i++) {
+		for (int i = 0; i < filter->sub_nr; i++) {
 			if (filter_bitmap(bitmap_git, tip_objects, to_filter,
 					  &filter->sub[i]) < 0)
 				return -1;
@@ -1693,7 +1682,6 @@ static void filter_packed_objects_from_bitmap(struct bitmap_index *bitmap_git,
 struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
 					 int filter_provided_objects)
 {
-	unsigned int i;
 	int use_boundary_traversal;
 
 	struct object_list *wants = NULL;
@@ -1721,7 +1709,7 @@ struct bitmap_index *prepare_bitmap_walk(struct rev_info *revs,
 	if (open_bitmap(revs->repo, bitmap_git) < 0)
 		goto cleanup;
 
-	for (i = 0; i < revs->pending.nr; ++i) {
+	for (unsigned int i = 0; i < revs->pending.nr; ++i) {
 		struct object *object = revs->pending.objects[i].item;
 
 		if (object->type == OBJ_NONE)
@@ -2374,12 +2362,12 @@ int test_bitmap_hashes(struct repository *r)
 {
 	struct bitmap_index *bitmap_git = prepare_bitmap_git(r);
 	struct object_id oid;
-	uint32_t i, index_pos;
+	uint32_t index_pos;
 
 	if (!bitmap_git || !bitmap_git->hashes)
 		goto cleanup;
 
-	for (i = 0; i < bitmap_num_objects(bitmap_git); i++) {
+	for (uint32_t i = 0; i < bitmap_num_objects(bitmap_git); i++) {
 		if (bitmap_is_midx(bitmap_git))
 			index_pos = pack_pos_to_midx(bitmap_git->midx, i);
 		else
@@ -2432,7 +2420,7 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
 				struct packing_data *mapping)
 {
 	struct repository *r = the_repository;
-	uint32_t i, num_objects;
+	uint32_t num_objects;
 	uint32_t *reposition;
 
 	if (!bitmap_is_midx(bitmap_git))
@@ -2444,7 +2432,7 @@ uint32_t *create_bitmap_mapping(struct bitmap_index *bitmap_git,
 	num_objects = bitmap_num_objects(bitmap_git);
 	CALLOC_ARRAY(reposition, num_objects);
 
-	for (i = 0; i < num_objects; ++i) {
+	for (uint32_t i = 0; i < num_objects; ++i) {
 		struct object_id oid;
 		struct object_entry *oe;
 		uint32_t index_pos;
@@ -2520,11 +2508,9 @@ static off_t get_disk_usage_for_type(struct bitmap_index *bitmap_git,
 	off_t total = 0;
 	struct ewah_iterator it;
 	eword_t filter;
-	size_t i;
 
 	init_type_iterator(&it, bitmap_git, object_type);
-	for (i = 0; i < result->word_alloc &&
-			ewah_iterator_next(&filter, &it); i++) {
+	for (size_t i = 0; i < result->word_alloc && ewah_iterator_next(&filter, &it); i++) {
 		eword_t word = result->words[i] & filter;
 		size_t base = (i * BITS_IN_EWORD);
 		unsigned offset;
@@ -2575,11 +2561,10 @@ static off_t get_disk_usage_for_extended(struct bitmap_index *bitmap_git)
 	off_t total = 0;
 	struct object_info oi = OBJECT_INFO_INIT;
 	off_t object_size;
-	size_t i;
 
 	oi.disk_sizep = &object_size;
 
-	for (i = 0; i < eindex->count; i++) {
+	for (size_t i = 0; i < eindex->count; i++) {
 		struct object *obj = eindex->objects[i];
 
 		if (!bitmap_get(result,
diff --git a/pack-objects.c b/pack-objects.c
index a9d9855063..2984b4b16c 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -41,7 +41,6 @@ static inline uint32_t closest_pow2(uint32_t v)
 
 static void rehash_objects(struct packing_data *pdata)
 {
-	uint32_t i;
 	struct object_entry *entry;
 
 	pdata->index_size = closest_pow2(pdata->nr_objects * 3);
@@ -53,7 +52,7 @@ static void rehash_objects(struct packing_data *pdata)
 
 	entry = pdata->objects;
 
-	for (i = 0; i < pdata->nr_objects; i++) {
+	for (uint32_t i = 0; i < pdata->nr_objects; i++) {
 		int found;
 		uint32_t ix = locate_object_entry_hash(pdata,
 						       &entry->idx.oid,
@@ -86,7 +85,7 @@ struct object_entry *packlist_find(struct packing_data *pdata,
 
 static void prepare_in_pack_by_idx(struct packing_data *pdata)
 {
-	struct packed_git **mapping, *p;
+	struct packed_git **mapping;
 	int cnt = 0, nr = 1U << OE_IN_PACK_BITS;
 
 	ALLOC_ARRAY(mapping, nr);
@@ -95,7 +94,8 @@ static void prepare_in_pack_by_idx(struct packing_data *pdata)
 	 * (i.e. in_pack_idx also zero) should return NULL.
 	 */
 	mapping[cnt++] = NULL;
-	for (p = get_all_packs(pdata->repo); p; p = p->next, cnt++) {
+	for (struct packed_git *p = get_all_packs(pdata->repo); p; p = p->next,
+	     cnt++) {
 		if (cnt == nr) {
 			free(mapping);
 			return;
@@ -117,14 +117,12 @@ static void prepare_in_pack_by_idx(struct packing_data *pdata)
  */
 void oe_map_new_pack(struct packing_data *pack)
 {
-	uint32_t i;
-
 	if (pack->in_pack)
 		BUG("packing_data has already been converted to pack array");
 
 	ALLOC_ARRAY(pack->in_pack, pack->nr_alloc);
 
-	for (i = 0; i < pack->nr_objects; i++)
+	for (uint32_t i = 0; i < pack->nr_objects; i++)
 		pack->in_pack[i] = oe_in_pack(pack, pack->objects + i);
 
 	FREE_AND_NULL(pack->in_pack_by_idx);
diff --git a/pack-revindex.c b/pack-revindex.c
index a7624d8be8..d9b10fc012 100644
--- a/pack-revindex.c
+++ b/pack-revindex.c
@@ -59,7 +59,6 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
 	 * to "to".
 	 */
 	struct revindex_entry *tmp, *from, *to;
-	int bits;
 	unsigned *pos;
 
 	ALLOC_ARRAY(pos, BUCKETS);
@@ -72,7 +71,7 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
 	 * on (and any higher) will be zero for all entries, and our loop will
 	 * be a no-op, as everybody lands in the same zero-th bucket.
 	 */
-	for (bits = 0; max >> bits; bits += DIGIT_SIZE) {
+	for (int bits = 0; max >> bits; bits += DIGIT_SIZE) {
 		unsigned i;
 
 		memset(pos, 0, BUCKETS * sizeof(*pos));
@@ -133,7 +132,6 @@ static void sort_revindex(struct revindex_entry *entries, unsigned n, off_t max)
 static void create_pack_revindex(struct packed_git *p)
 {
 	const unsigned num_ent = p->num_objects;
-	unsigned i;
 	const char *index = p->index_data;
 	const unsigned hashsz = the_hash_algo->rawsz;
 
@@ -144,7 +142,7 @@ static void create_pack_revindex(struct packed_git *p)
 		const uint32_t *off_32 =
 			(uint32_t *)(index + 8 + (size_t)p->num_objects * (hashsz + 4));
 		const uint32_t *off_64 = off_32 + p->num_objects;
-		for (i = 0; i < num_ent; i++) {
+		for (unsigned i = 0; i < num_ent; i++) {
 			const uint32_t off = ntohl(*off_32++);
 			if (!(off & 0x80000000)) {
 				p->revindex[i].offset = off;
@@ -155,7 +153,7 @@ static void create_pack_revindex(struct packed_git *p)
 			p->revindex[i].nr = i;
 		}
 	} else {
-		for (i = 0; i < num_ent; i++) {
+		for (unsigned i = 0; i < num_ent; i++) {
 			const uint32_t hl = *((uint32_t *)(index + (hashsz + 4) * i));
 			p->revindex[i].offset = ntohl(hl);
 			p->revindex[i].nr = i;
diff --git a/pack-write.c b/pack-write.c
index 80ecfa544c..3395ac3296 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -199,8 +199,7 @@ static void write_rev_index_positions(struct hashfile *f,
 				      uint32_t *pack_order,
 				      uint32_t nr_objects)
 {
-	uint32_t i;
-	for (i = 0; i < nr_objects; i++)
+	for (uint32_t i = 0; i < nr_objects; i++)
 		hashwrite_be32(f, pack_order[i]);
 }
 
@@ -216,14 +215,13 @@ const char *write_rev_file(const char *rev_name,
 			   unsigned flags)
 {
 	uint32_t *pack_order;
-	uint32_t i;
 	const char *ret;
 
 	if (!(flags & WRITE_REV) && !(flags & WRITE_REV_VERIFY))
 		return NULL;
 
 	ALLOC_ARRAY(pack_order, nr_objects);
-	for (i = 0; i < nr_objects; i++)
+	for (uint32_t i = 0; i < nr_objects; i++)
 		pack_order[i] = i;
 	QSORT_S(pack_order, nr_objects, pack_order_cmp, objects);
 
@@ -302,8 +300,7 @@ static void write_mtimes_objects(struct hashfile *f,
 				 struct pack_idx_entry **objects,
 				 uint32_t nr_objects)
 {
-	uint32_t i;
-	for (i = 0; i < nr_objects; i++) {
+	for (uint32_t i = 0; i < nr_objects; i++) {
 		struct object_entry *e = (struct object_entry*)objects[i];
 		hashwrite_be32(f, oe_cruft_mtime(to_pack, e));
 	}
@@ -577,10 +574,10 @@ void stage_tmp_packfiles(struct strbuf *name_buffer,
 
 void write_promisor_file(const char *promisor_name, struct ref **sought, int nr_sought)
 {
-	int i, err;
+	int err;
 	FILE *output = xfopen(promisor_name, "w");
 
-	for (i = 0; i < nr_sought; i++)
+	for (int i = 0; i < nr_sought; i++)
 		fprintf(output, "%s %s\n", oid_to_hex(&sought[i]->old_oid),
 			sought[i]->name);
 
diff --git a/packfile.c b/packfile.c
index 84a005674d..3060b505db 100644
--- a/packfile.c
+++ b/packfile.c
@@ -117,7 +117,7 @@ int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
 	     size_t idx_size, struct packed_git *p)
 {
 	struct pack_idx_header *hdr = idx_map;
-	uint32_t version, nr, i, *index;
+	uint32_t version, nr, *index;
 
 	if (idx_size < 4 * 256 + hashsz + hashsz)
 		return error("index file %s is too small", path);
@@ -138,7 +138,7 @@ int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
 	index = idx_map;
 	if (version > 1)
 		index += 2;  /* skip index header */
-	for (i = 0; i < 256; i++) {
+	for (uint32_t i = 0; i < 256; i++) {
 		uint32_t n = ntohl(index[i]);
 		if (n < nr)
 			return error("non-monotonic index %s", path);
@@ -272,12 +272,12 @@ static void scan_windows(struct packed_git *p,
 
 static int unuse_one_window(struct packed_git *current)
 {
-	struct packed_git *p, *lru_p = NULL;
+	struct packed_git *lru_p = NULL;
 	struct pack_window *lru_w = NULL, *lru_l = NULL;
 
 	if (current)
 		scan_windows(current, &lru_p, &lru_w, &lru_l);
-	for (p = the_repository->objects->packed_git; p; p = p->next)
+	for (struct packed_git *p = the_repository->objects->packed_git; p; p = p->next)
 		scan_windows(p, &lru_p, &lru_w, &lru_l);
 	if (lru_p) {
 		munmap(lru_w->base, lru_w->len);
@@ -360,9 +360,7 @@ void close_pack(struct packed_git *p)
 
 void close_object_store(struct raw_object_store *o)
 {
-	struct packed_git *p;
-
-	for (p = o->packed_git; p; p = p->next)
+	for (struct packed_git *p = o->packed_git; p; p = p->next)
 		if (p->do_not_close)
 			BUG("want to close pack marked 'do-not-close'");
 		else
@@ -379,7 +377,6 @@ void close_object_store(struct raw_object_store *o)
 void unlink_pack_path(const char *pack_name, int force_delete)
 {
 	static const char *exts[] = {".idx", ".pack", ".rev", ".keep", ".bitmap", ".promisor", ".mtimes"};
-	int i;
 	struct strbuf buf = STRBUF_INIT;
 	size_t plen;
 
@@ -395,7 +392,7 @@ void unlink_pack_path(const char *pack_name, int force_delete)
 		}
 	}
 
-	for (i = 0; i < ARRAY_SIZE(exts); i++) {
+	for (int i = 0; i < ARRAY_SIZE(exts); i++) {
 		strbuf_setlen(&buf, plen);
 		strbuf_addstr(&buf, exts[i]);
 		unlink(buf.buf);
@@ -410,7 +407,7 @@ void unlink_pack_path(const char *pack_name, int force_delete)
  */
 static void find_lru_pack(struct packed_git *p, struct packed_git **lru_p, struct pack_window **mru_w, int *accept_windows_inuse)
 {
-	struct pack_window *w, *this_mru_w;
+	struct pack_window *this_mru_w;
 	int has_windows_inuse = 0;
 
 	/*
@@ -421,7 +418,7 @@ static void find_lru_pack(struct packed_git *p, struct packed_git **lru_p, struc
 	if (*lru_p && !*mru_w && (p->windows || p->mtime > (*lru_p)->mtime))
 		return;
 
-	for (w = this_mru_w = p->windows; w; w = w->next) {
+	for (struct pack_window *w = this_mru_w = p->windows; w; w = w->next) {
 		/*
 		 * Reject this pack if any of its windows are in use,
 		 * but the previously selected pack did not have any
@@ -461,11 +458,11 @@ static void find_lru_pack(struct packed_git *p, struct packed_git **lru_p, struc
 
 static int close_one_pack(void)
 {
-	struct packed_git *p, *lru_p = NULL;
+	struct packed_git *lru_p = NULL;
 	struct pack_window *mru_w = NULL;
 	int accept_windows_inuse = 1;
 
-	for (p = the_repository->objects->packed_git; p; p = p->next) {
+	for (struct packed_git *p = the_repository->objects->packed_git; p; p = p->next) {
 		if (p->pack_fd == -1)
 			continue;
 		find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
@@ -781,14 +778,14 @@ static void report_helper(const struct string_list *list,
 
 static void report_pack_garbage(struct string_list *list)
 {
-	int i, baselen = -1, first = 0, seen_bits = 0;
+	int baselen = -1, first = 0, seen_bits = 0;
 
 	if (!report_garbage)
 		return;
 
 	string_list_sort(list);
 
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		const char *path = list->items[i].string;
 		if (baselen != -1 &&
 		    strncmp(path, list->items[first].string, baselen)) {
@@ -928,14 +925,12 @@ unsigned long repo_approximate_object_count(struct repository *r)
 {
 	if (!r->objects->approximate_object_count_valid) {
 		unsigned long count;
-		struct multi_pack_index *m;
-		struct packed_git *p;
 
 		prepare_packed_git(r);
 		count = 0;
-		for (m = get_multi_pack_index(r); m; m = m->next)
+		for (struct multi_pack_index *m = get_multi_pack_index(r); m; m = m->next)
 			count += m->num_objects;
-		for (p = r->objects->packed_git; p; p = p->next) {
+		for (struct packed_git *p = r->objects->packed_git; p; p = p->next) {
 			if (open_pack_index(p))
 				continue;
 			count += p->num_objects;
@@ -981,23 +976,19 @@ static void rearrange_packed_git(struct repository *r)
 
 static void prepare_packed_git_mru(struct repository *r)
 {
-	struct packed_git *p;
-
 	INIT_LIST_HEAD(&r->objects->packed_git_mru);
 
-	for (p = r->objects->packed_git; p; p = p->next)
+	for (struct packed_git *p = r->objects->packed_git; p; p = p->next)
 		list_add_tail(&p->mru, &r->objects->packed_git_mru);
 }
 
 static void prepare_packed_git(struct repository *r)
 {
-	struct object_directory *odb;
-
 	if (r->objects->packed_git_initialized)
 		return;
 
 	prepare_alt_odb(r);
-	for (odb = r->objects->odb; odb; odb = odb->next) {
+	for (struct object_directory *odb = r->objects->odb; odb; odb = odb->next) {
 		int local = (odb == r->objects->odb);
 		prepare_multi_pack_index_one(r, odb->path, local);
 		prepare_packed_git_one(r, odb->path, local);
@@ -1010,8 +1001,6 @@ static void prepare_packed_git(struct repository *r)
 
 void reprepare_packed_git(struct repository *r)
 {
-	struct object_directory *odb;
-
 	obj_read_lock();
 
 	/*
@@ -1023,7 +1012,7 @@ void reprepare_packed_git(struct repository *r)
 	r->objects->loaded_alternates = 0;
 	prepare_alt_odb(r);
 
-	for (odb = r->objects->odb; odb; odb = odb->next)
+	for (struct object_directory *odb = r->objects->odb; odb; odb = odb->next)
 		odb_clear_loose_cache(odb);
 
 	r->objects->approximate_object_count_valid = 0;
@@ -1057,10 +1046,8 @@ struct multi_pack_index *get_local_multi_pack_index(struct repository *r)
 
 struct packed_git *get_all_packs(struct repository *r)
 {
-	struct multi_pack_index *m;
-
 	prepare_packed_git(r);
-	for (m = r->objects->multi_pack_index; m; m = m->next) {
+	for (struct multi_pack_index *m = r->objects->multi_pack_index; m; m = m->next) {
 		uint32_t i;
 		for (i = 0; i < m->num_packs; i++)
 			prepare_midx_pack(r, m, i);
@@ -1189,9 +1176,7 @@ void mark_bad_packed_object(struct packed_git *p, const struct object_id *oid)
 const struct packed_git *has_packed_and_bad(struct repository *r,
 					    const struct object_id *oid)
 {
-	struct packed_git *p;
-
-	for (p = r->objects->packed_git; p; p = p->next)
+	for (struct packed_git *p = r->objects->packed_git; p; p = p->next)
 		if (oidset_contains(&p->bad_objects, oid))
 			return p;
 	return NULL;
@@ -2001,9 +1986,7 @@ int is_pack_valid(struct packed_git *p)
 struct packed_git *find_sha1_pack(const unsigned char *sha1,
 				  struct packed_git *packs)
 {
-	struct packed_git *p;
-
-	for (p = packs; p; p = p->next) {
+	for (struct packed_git *p = packs; p; p = p->next) {
 		if (find_pack_entry_one(sha1, p))
 			return p;
 	}
@@ -2042,13 +2025,12 @@ static int fill_pack_entry(const struct object_id *oid,
 int find_pack_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e)
 {
 	struct list_head *pos;
-	struct multi_pack_index *m;
 
 	prepare_packed_git(r);
 	if (!r->objects->packed_git && !r->objects->multi_pack_index)
 		return 0;
 
-	for (m = r->objects->multi_pack_index; m; m = m->next) {
+	for (struct multi_pack_index *m = r->objects->multi_pack_index; m; m = m->next) {
 		if (fill_midx_entry(r, oid, e, m))
 			return 1;
 	}
@@ -2081,17 +2063,7 @@ static struct packed_git **kept_pack_cache(struct repository *r, unsigned flags)
 	if (!r->objects->kept_pack_cache.packs) {
 		struct packed_git **packs = NULL;
 		size_t nr = 0, alloc = 0;
-		struct packed_git *p;
-
-		/*
-		 * We want "all" packs here, because we need to cover ones that
-		 * are used by a midx, as well. We need to look in every one of
-		 * them (instead of the midx itself) to cover duplicates. It's
-		 * possible that an object is found in two packs that the midx
-		 * covers, one kept and one not kept, but the midx returns only
-		 * the non-kept version.
-		 */
-		for (p = get_all_packs(r); p; p = p->next) {
+		for (struct packed_git *p = get_all_packs(r); p; p = p->next) {
 			if ((p->pack_keep && (flags & ON_DISK_KEEP_PACKS)) ||
 			    (p->pack_keep_in_core && (flags & IN_CORE_KEEP_PACKS))) {
 				ALLOC_GROW(packs, nr + 1, alloc);
@@ -2113,9 +2085,7 @@ int find_kept_pack_entry(struct repository *r,
 			 unsigned flags,
 			 struct pack_entry *e)
 {
-	struct packed_git **cache;
-
-	for (cache = kept_pack_cache(r, flags); *cache; cache++) {
+	for (struct packed_git **cache = kept_pack_cache(r, flags); *cache; cache++) {
 		struct packed_git *p = *cache;
 		if (fill_pack_entry(oid, e, p))
 			return 1;
@@ -2148,7 +2118,6 @@ int for_each_object_in_pack(struct packed_git *p,
 			    each_packed_object_fn cb, void *data,
 			    enum for_each_object_flags flags)
 {
-	uint32_t i;
 	int r = 0;
 
 	if (flags & FOR_EACH_OBJECT_PACK_ORDER) {
@@ -2156,7 +2125,7 @@ int for_each_object_in_pack(struct packed_git *p,
 			return -1;
 	}
 
-	for (i = 0; i < p->num_objects; i++) {
+	for (uint32_t i = 0; i < p->num_objects; i++) {
 		uint32_t index_pos;
 		struct object_id oid;
 
@@ -2191,12 +2160,11 @@ int for_each_object_in_pack(struct packed_git *p,
 int for_each_packed_object(each_packed_object_fn cb, void *data,
 			   enum for_each_object_flags flags)
 {
-	struct packed_git *p;
 	int r = 0;
 	int pack_errors = 0;
 
 	prepare_packed_git(the_repository);
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
 			continue;
 		if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
diff --git a/pager.c b/pager.c
index b8822a9381..b5288cb880 100644
--- a/pager.c
+++ b/pager.c
@@ -77,7 +77,6 @@ const char *git_pager(int stdout_is_tty)
 static void setup_pager_env(struct strvec *env)
 {
 	const char **argv;
-	int i;
 	char *pager_env = xstrdup(PAGER_ENV);
 	int n = split_cmdline(pager_env, &argv);
 
@@ -85,7 +84,7 @@ static void setup_pager_env(struct strvec *env)
 		die("malformed build-time PAGER_ENV: %s",
 			split_cmdline_strerror(n));
 
-	for (i = 0; i < n; i++) {
+	for (int i = 0; i < n; i++) {
 		char *cp = strchr(argv[i], '=');
 
 		if (!cp)
diff --git a/parallel-checkout.c b/parallel-checkout.c
index b5a714c711..f6c21985e8 100644
--- a/parallel-checkout.c
+++ b/parallel-checkout.c
@@ -451,9 +451,8 @@ static void send_one_item(int fd, struct parallel_checkout_item *pc_item)
 
 static void send_batch(int fd, size_t start, size_t nr)
 {
-	size_t i;
 	sigchain_push(SIGPIPE, SIG_IGN);
-	for (i = 0; i < nr; i++)
+	for (size_t i = 0; i < nr; i++)
 		send_one_item(fd, &parallel_checkout.items[start + i]);
 	packet_flush(fd);
 	sigchain_pop(SIGPIPE);
@@ -640,9 +639,7 @@ static void gather_results_from_workers(struct pc_worker *workers,
 
 static void write_items_sequentially(struct checkout *state)
 {
-	size_t i;
-
-	for (i = 0; i < parallel_checkout.nr; i++) {
+	for (size_t i = 0; i < parallel_checkout.nr; i++) {
 		struct parallel_checkout_item *pc_item = &parallel_checkout.items[i];
 		write_pc_item(pc_item, state);
 		if (pc_item->status != PC_ITEM_COLLIDED)
diff --git a/parse-options.c b/parse-options.c
index 63a99dea6e..4f76dd618f 100644
--- a/parse-options.c
+++ b/parse-options.c
@@ -333,15 +333,13 @@ static int is_alias(struct parse_opt_ctx_t *ctx,
 		    const struct option *one_opt,
 		    const struct option *another_opt)
 {
-	const char **group;
-
 	if (!ctx->alias_groups)
 		return 0;
 
 	if (!one_opt->long_name || !another_opt->long_name)
 		return 0;
 
-	for (group = ctx->alias_groups; *group; group += 3) {
+	for (const char **group = ctx->alias_groups; *group; group += 3) {
 		/* it and other are from the same family? */
 		if (has_string(one_opt->long_name, group) &&
 		    has_string(another_opt->long_name, group))
@@ -797,12 +795,10 @@ static struct option *preprocess_options(struct parse_opt_ctx_t *ctx,
 
 static void free_preprocessed_options(struct option *options)
 {
-	int i;
-
 	if (!options)
 		return;
 
-	for (i = 0; options[i].type != OPTION_END; i++) {
+	for (int i = 0; options[i].type != OPTION_END; i++) {
 		if (options[i].flags & PARSE_OPT_FROM_ALIAS)
 			free((void *)options[i].help);
 	}
diff --git a/path.c b/path.c
index 8bb223c92c..fbdb78d17c 100644
--- a/path.c
+++ b/path.c
@@ -337,12 +337,10 @@ static int common_trie_done_setup;
 
 static void init_common_trie(void)
 {
-	struct common_dir *p;
-
 	if (common_trie_done_setup)
 		return;
 
-	for (p = common_list; p->path; p++)
+	for (struct common_dir *p = common_list; p->path; p++)
 		add_to_trie(&common_trie, p->path, p);
 
 	common_trie_done_setup = 1;
@@ -383,14 +381,13 @@ static void update_common_dir(struct strbuf *buf, int git_dir_len,
 void report_linked_checkout_garbage(void)
 {
 	struct strbuf sb = STRBUF_INIT;
-	const struct common_dir *p;
 	int len;
 
 	if (!the_repository->different_commondir)
 		return;
 	strbuf_addf(&sb, "%s/", get_git_dir());
 	len = sb.len;
-	for (p = common_list; p->path; p++) {
+	for (const struct common_dir *p = common_list; p->path; p++) {
 		const char *path = p->path;
 		if (p->ignore_garbage)
 			continue;
@@ -1248,12 +1245,12 @@ int strbuf_normalize_path(struct strbuf *src)
  */
 int longest_ancestor_length(const char *path, struct string_list *prefixes)
 {
-	int i, max_len = -1;
+	int max_len = -1;
 
 	if (!strcmp(path, "/"))
 		return -1;
 
-	for (i = 0; i < prefixes->nr; i++) {
+	for (int i = 0; i < prefixes->nr; i++) {
 		const char *ceil = prefixes->items[i].string;
 		int len = strlen(ceil);
 
diff --git a/pathspec.c b/pathspec.c
index 2133b9fe60..bc92b4d572 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -75,9 +75,7 @@ char *find_pathspecs_matching_skip_worktree(const struct pathspec *pathspec)
 {
 	struct index_state *istate = the_repository->index;
 	char *seen = xcalloc(pathspec->nr, 1);
-	int i;
-
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		if (ce_skip_worktree(ce) || !path_in_sparse_checkout(ce->name, istate))
 		    ce_path_match(istate, ce, pathspec, seen);
@@ -561,8 +559,7 @@ static int pathspec_item_cmp(const void *a_, const void *b_)
 
 void pathspec_magic_names(unsigned magic, struct strbuf *out)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
+	for (int i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
 		const struct pathspec_magic *m = pathspec_magic + i;
 		if (!(magic & m->bit))
 			continue;
@@ -597,7 +594,7 @@ void parse_pathspec(struct pathspec *pathspec,
 {
 	struct pathspec_item *item;
 	const char *entry = argv ? *argv : NULL;
-	int i, n, prefixlen, nr_exclude = 0;
+	int n, prefixlen, nr_exclude = 0;
 
 	memset(pathspec, 0, sizeof(*pathspec));
 
@@ -642,7 +639,7 @@ void parse_pathspec(struct pathspec *pathspec,
 	item = pathspec->items;
 	prefixlen = prefix ? strlen(prefix) : 0;
 
-	for (i = 0; i < n; i++) {
+	for (int i = 0; i < n; i++) {
 		entry = argv[i];
 
 		init_pathspec_item(item + i, flags, prefix, prefixlen, entry);
@@ -717,12 +714,12 @@ void parse_pathspec_file(struct pathspec *pathspec, unsigned magic_mask,
 
 void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 {
-	int i, j;
+	int j;
 
 	*dst = *src;
 	DUP_ARRAY(dst->items, src->items, dst->nr);
 
-	for (i = 0; i < dst->nr; i++) {
+	for (int i = 0; i < dst->nr; i++) {
 		struct pathspec_item *d = &dst->items[i];
 		struct pathspec_item *s = &src->items[i];
 
@@ -741,9 +738,9 @@ void copy_pathspec(struct pathspec *dst, const struct pathspec *src)
 
 void clear_pathspec(struct pathspec *pathspec)
 {
-	int i, j;
+	int j;
 
-	for (i = 0; i < pathspec->nr; i++) {
+	for (int i = 0; i < pathspec->nr; i++) {
 		free(pathspec->items[i].match);
 		free(pathspec->items[i].original);
 
@@ -763,7 +760,6 @@ int match_pathspec_attrs(struct index_state *istate,
 			 const char *name, int namelen,
 			 const struct pathspec_item *item)
 {
-	int i;
 	char *to_free = NULL;
 
 	if (name[namelen])
@@ -773,7 +769,7 @@ int match_pathspec_attrs(struct index_state *istate,
 
 	free(to_free);
 
-	for (i = 0; i < item->attr_match_nr; i++) {
+	for (int i = 0; i < item->attr_match_nr; i++) {
 		const char *value;
 		int matched;
 		enum attr_match_mode match_mode;
@@ -800,7 +796,7 @@ int match_pathspec_attrs(struct index_state *istate,
 int pathspec_needs_expanded_index(struct index_state *istate,
 				  const struct pathspec *pathspec)
 {
-	unsigned int i, pos;
+	unsigned int pos;
 	int res = 0;
 	char *skip_worktree_seen = NULL;
 
@@ -817,7 +813,7 @@ int pathspec_needs_expanded_index(struct index_state *istate,
 	if (pathspec->magic)
 		return 1;
 
-	for (i = 0; i < pathspec->nr; i++) {
+	for (unsigned int i = 0; i < pathspec->nr; i++) {
 		struct pathspec_item item = pathspec->items[i];
 
 		/*
diff --git a/pkt-line.c b/pkt-line.c
index 24479eae4d..0157789bf2 100644
--- a/pkt-line.c
+++ b/pkt-line.c
@@ -39,7 +39,6 @@ static int packet_trace_pack(const char *buf, unsigned int len, int sideband)
 
 static void packet_trace(const char *buf, unsigned int len, int write)
 {
-	int i;
 	struct strbuf out;
 	static int in_pack, sideband;
 
@@ -72,7 +71,7 @@ static void packet_trace(const char *buf, unsigned int len, int write)
 		    get_trace_prefix(), write ? '>' : '<');
 
 	/* XXX we should really handle printable utf8 */
-	for (i = 0; i < len; i++) {
+	for (int i = 0; i < len; i++) {
 		/* suppress newlines */
 		if (buf[i] == '\n')
 			continue;
diff --git a/pretty.c b/pretty.c
index cf964b060c..223f5f71ba 100644
--- a/pretty.c
+++ b/pretty.c
@@ -137,14 +137,13 @@ static struct cmt_fmt_map *find_commit_format_recursive(const char *sought,
 {
 	struct cmt_fmt_map *found = NULL;
 	size_t found_match_len = 0;
-	int i;
 
 	if (num_redirections >= commit_formats_len)
 		die("invalid --pretty format: "
 		    "'%s' references an alias which points to itself",
 		    original);
 
-	for (i = 0; i < commit_formats_len; i++) {
+	for (int i = 0; i < commit_formats_len; i++) {
 		size_t match_len;
 
 		if (!starts_with(commit_formats[i].name, sought))
@@ -268,8 +267,7 @@ static int is_rfc822_special(char ch)
 
 static int needs_rfc822_quoting(const char *s, int len)
 {
-	int i;
-	for (i = 0; i < len; i++)
+	for (int i = 0; i < len; i++)
 		if (is_rfc822_special(s[i]))
 			return 1;
 	return 0;
@@ -288,13 +286,11 @@ static int last_line_length(struct strbuf *sb)
 
 static void add_rfc822_quoted(struct strbuf *out, const char *s, int len)
 {
-	int i;
-
 	/* just a guess, we may have to also backslash-quote */
 	strbuf_grow(out, len + 2);
 
 	strbuf_addch(out, '"');
-	for (i = 0; i < len; i++) {
+	for (int i = 0; i < len; i++) {
 		switch (s[i]) {
 		case '"':
 		case '\\':
@@ -366,9 +362,7 @@ static int is_rfc2047_special(char ch, enum rfc2047_type type)
 
 static int needs_rfc2047_encoding(const char *line, int len)
 {
-	int i;
-
-	for (i = 0; i < len; i++) {
+	for (int i = 0; i < len; i++) {
 		int ch = line[i];
 		if (non_ascii(ch) || ch == '\n')
 			return 1;
@@ -937,9 +931,7 @@ void format_sanitized_subject(struct strbuf *sb, const char *msg, size_t len)
 	size_t trimlen;
 	size_t start_len = sb->len;
 	int space = 2;
-	int i;
-
-	for (i = 0; i < len; i++) {
+	for (int i = 0; i < len; i++) {
 		if (istitlechar(msg[i])) {
 			if (space == 1)
 				strbuf_addch(sb, '-');
@@ -2131,8 +2123,7 @@ void pp_title_line(struct pretty_print_context *pp,
 	}
 
 	if (pp->in_body_headers.nr) {
-		int i;
-		for (i = 0; i < pp->in_body_headers.nr; i++) {
+		for (int i = 0; i < pp->in_body_headers.nr; i++) {
 			strbuf_addstr(sb, pp->in_body_headers.items[i].string);
 			free(pp->in_body_headers.items[i].string);
 		}
@@ -2301,9 +2292,9 @@ void pretty_print_commit(struct pretty_print_context *pp,
 	 * as 8-bit if we haven't done so.
 	 */
 	if (cmit_fmt_is_mail(pp->fmt) && need_8bit_cte == 0) {
-		int i, ch, in_body;
+		int i, ch;
 
-		for (in_body = i = 0; (ch = msg[i]); i++) {
+		for (int in_body = i = 0; (ch = msg[i]); i++) {
 			if (!in_body) {
 				/* author could be non 7-bit ASCII but
 				 * the log may be so; skip over the
diff --git a/prio-queue.c b/prio-queue.c
index 450775a374..5f3eee8746 100644
--- a/prio-queue.c
+++ b/prio-queue.c
@@ -17,11 +17,11 @@ static inline void swap(struct prio_queue *queue, int i, int j)
 
 void prio_queue_reverse(struct prio_queue *queue)
 {
-	int i, j;
+	int j;
 
 	if (queue->compare)
 		BUG("prio_queue_reverse() on non-LIFO queue");
-	for (i = 0; i < (j = (queue->nr - 1) - i); i++)
+	for (int i = 0; i < (j = (queue->nr - 1) - i); i++)
 		swap(queue, i, j);
 }
 
@@ -35,7 +35,7 @@ void clear_prio_queue(struct prio_queue *queue)
 
 void prio_queue_put(struct prio_queue *queue, void *thing)
 {
-	int ix, parent;
+	int parent;
 
 	/* Append at the end */
 	ALLOC_GROW(queue->array, queue->nr + 1, queue->alloc);
@@ -46,7 +46,7 @@ void prio_queue_put(struct prio_queue *queue, void *thing)
 		return; /* LIFO */
 
 	/* Bubble up the new one */
-	for (ix = queue->nr - 1; ix; ix = parent) {
+	for (int ix = queue->nr - 1; ix; ix = parent) {
 		parent = (ix - 1) / 2;
 		if (compare(queue, parent, ix) <= 0)
 			break;
@@ -58,7 +58,7 @@ void prio_queue_put(struct prio_queue *queue, void *thing)
 void *prio_queue_get(struct prio_queue *queue)
 {
 	void *result;
-	int ix, child;
+	int child;
 
 	if (!queue->nr)
 		return NULL;
@@ -72,7 +72,7 @@ void *prio_queue_get(struct prio_queue *queue)
 	queue->array[0] = queue->array[queue->nr];
 
 	/* Push down the one at the root */
-	for (ix = 0; ix * 2 + 1 < queue->nr; ix = child) {
+	for (int ix = 0; ix * 2 + 1 < queue->nr; ix = child) {
 		child = ix * 2 + 1; /* left */
 		if (child + 1 < queue->nr &&
 		    compare(queue, child, child + 1) >= 0)
diff --git a/promisor-remote.c b/promisor-remote.c
index ac3aa1e365..b4a0fae209 100644
--- a/promisor-remote.c
+++ b/promisor-remote.c
@@ -20,7 +20,6 @@ static int fetch_objects(struct repository *repo,
 			 int oid_nr)
 {
 	struct child_process child = CHILD_PROCESS_INIT;
-	int i;
 	FILE *child_in;
 
 	child.git_cmd = 1;
@@ -37,7 +36,7 @@ static int fetch_objects(struct repository *repo,
 
 	trace2_data_intmax("promisor", repo, "fetch_count", oid_nr);
 
-	for (i = 0; i < oid_nr; i++) {
+	for (int i = 0; i < oid_nr; i++) {
 		if (fputs(oid_to_hex(&oids[i]), child_in) < 0)
 			die_errno(_("promisor-remote: could not write to fetch subprocess"));
 		if (fputc('\n', child_in) < 0)
@@ -240,7 +239,6 @@ void promisor_remote_get_direct(struct repository *repo,
 				const struct object_id *oids,
 				int oid_nr)
 {
-	struct promisor_remote *r;
 	struct object_id *remaining_oids = (struct object_id *)oids;
 	int remaining_nr = oid_nr;
 	int to_free = 0;
@@ -251,7 +249,7 @@ void promisor_remote_get_direct(struct repository *repo,
 
 	promisor_remote_init(repo);
 
-	for (r = repo->promisor_remote_config->promisors; r; r = r->next) {
+	for (struct promisor_remote *r = repo->promisor_remote_config->promisors; r; r = r->next) {
 		if (fetch_objects(repo, r->name, remaining_oids, remaining_nr) < 0) {
 			if (remaining_nr == 1)
 				continue;
diff --git a/quote.c b/quote.c
index 3c05194496..cf07a8a0d3 100644
--- a/quote.c
+++ b/quote.c
@@ -48,7 +48,6 @@ void sq_quote_buf(struct strbuf *dst, const char *src)
 void sq_quote_buf_pretty(struct strbuf *dst, const char *src)
 {
 	static const char ok_punct[] = "+,-./:=@_^";
-	const char *p;
 
 	/* Avoid losing a zero-length string by adding '' */
 	if (!*src) {
@@ -56,7 +55,7 @@ void sq_quote_buf_pretty(struct strbuf *dst, const char *src)
 		return;
 	}
 
-	for (p = src; *p; p++) {
+	for (const char *p = src; *p; p++) {
 		if (!isalnum(*p) && !strchr(ok_punct, *p)) {
 			sq_quote_buf(dst, src);
 			return;
@@ -82,11 +81,9 @@ void sq_quotef(struct strbuf *dst, const char *fmt, ...)
 
 void sq_quote_argv(struct strbuf *dst, const char **argv)
 {
-	int i;
-
 	/* Copy into destination buffer. */
 	strbuf_grow(dst, 255);
-	for (i = 0; argv[i]; ++i) {
+	for (int i = 0; argv[i]; ++i) {
 		strbuf_addch(dst, ' ');
 		sq_quote_buf(dst, argv[i]);
 	}
@@ -109,9 +106,7 @@ void sq_quote_argv_pretty(struct strbuf *dst, const char **argv)
  */
 void sq_append_quote_argv_pretty(struct strbuf *dst, const char **argv)
 {
-	int i;
-
-	for (i = 0; argv[i]; i++) {
+	for (int i = 0; argv[i]; i++) {
 		if (i > 0)
 			strbuf_addch(dst, ' ');
 		sq_quote_buf_pretty(dst, argv[i]);
diff --git a/reachable.c b/reachable.c
index 3b85add243..b8819ff685 100644
--- a/reachable.c
+++ b/reachable.c
@@ -160,14 +160,13 @@ static void load_gc_recent_objects(struct recent_data *data)
 {
 	const struct string_list *programs;
 	int ret = 0;
-	size_t i;
 
 	data->extra_recent_oids_loaded = 1;
 
 	if (git_config_get_string_multi("gc.recentobjectshook", &programs))
 		return;
 
-	for (i = 0; i < programs->nr; i++) {
+	for (size_t i = 0; i < programs->nr; i++) {
 		ret = run_one_gc_recent_objects_hook(&data->extra_recent_oids,
 						       programs->items[i].string);
 		if (ret)
diff --git a/read-cache.c b/read-cache.c
index f546cf7875..811bbce3d3 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -584,9 +584,9 @@ int remove_index_entry_at(struct index_state *istate, int pos)
 void remove_marked_cache_entries(struct index_state *istate, int invalidate)
 {
 	struct cache_entry **ce_array = istate->cache;
-	unsigned int i, j;
+	unsigned int j;
 
-	for (i = j = 0; i < istate->cache_nr; i++) {
+	for (unsigned int i = j = 0; i < istate->cache_nr; i++) {
 		if (ce_array[i]->ce_flags & CE_REMOVE) {
 			if (invalidate) {
 				cache_tree_invalidate_path(istate,
@@ -1528,7 +1528,6 @@ int refresh_index(struct index_state *istate, unsigned int flags,
 		  const struct pathspec *pathspec,
 		  char *seen, const char *header_msg)
 {
-	int i;
 	int has_errors = 0;
 	int really = (flags & REFRESH_REALLY) != 0;
 	int allow_unmerged = (flags & REFRESH_UNMERGED) != 0;
@@ -1568,7 +1567,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,
 	preload_index(istate, pathspec, 0);
 	trace2_region_enter("index", "refresh", NULL);
 
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce, *new_entry;
 		int cache_errno = 0;
 		int changed = 0;
@@ -1925,12 +1924,10 @@ static struct cache_entry *create_from_disk(struct mem_pool *ce_mem_pool,
 
 static void check_ce_order(struct index_state *istate)
 {
-	unsigned int i;
-
 	if (!verify_ce_order)
 		return;
 
-	for (i = 1; i < istate->cache_nr; i++) {
+	for (unsigned int i = 1; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i - 1];
 		struct cache_entry *next_ce = istate->cache[i];
 		int name_compare = strcmp(ce->name, next_ce->name);
@@ -2074,10 +2071,9 @@ static unsigned long load_cache_entry_block(struct index_state *istate,
 			struct mem_pool *ce_mem_pool, int offset, int nr, const char *mmap,
 			unsigned long start_offset, const struct cache_entry *previous_ce)
 {
-	int i;
 	unsigned long src_offset = start_offset;
 
-	for (i = offset; i < offset + nr; i++) {
+	for (int i = offset; i < offset + nr; i++) {
 		struct cache_entry *ce;
 		unsigned long consumed;
 
@@ -2140,10 +2136,7 @@ struct load_cache_entries_thread_data
 static void *load_cache_entries_thread(void *_data)
 {
 	struct load_cache_entries_thread_data *p = _data;
-	int i;
-
-	/* iterate across all ieot blocks assigned to this thread */
-	for (i = p->ieot_start; i < p->ieot_start + p->ieot_blocks; i++) {
+	for (int i = p->ieot_start; i < p->ieot_start + p->ieot_blocks; i++) {
 		p->consumed += load_cache_entry_block(p->istate, p->ce_mem_pool,
 			p->offset, p->ieot->entries[i].nr, p->mmap, p->ieot->entries[i].offset, NULL);
 		p->offset += p->ieot->entries[i].nr;
@@ -2517,12 +2510,10 @@ void discard_index(struct index_state *istate)
  */
 void validate_cache_entries(const struct index_state *istate)
 {
-	int i;
-
 	if (!should_validate_cache_entries() ||!istate || !istate->initialized)
 		return;
 
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		if (!istate) {
 			BUG("cache entry is not allocated from expected memory pool");
 		} else if (!istate->ce_mem_pool ||
@@ -2542,8 +2533,7 @@ void validate_cache_entries(const struct index_state *istate)
 
 int unmerged_index(const struct index_state *istate)
 {
-	int i;
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		if (ce_stage(istate->cache[i]))
 			return 1;
 	}
@@ -2556,7 +2546,6 @@ int repo_index_has_changes(struct repository *repo,
 {
 	struct index_state *istate = repo->index;
 	struct object_id cmp;
-	int i;
 
 	if (tree)
 		cmp = tree->object.oid;
@@ -2570,7 +2559,7 @@ int repo_index_has_changes(struct repository *repo,
 		diff_setup_done(&opt);
 		do_diff_cache(&cmp, &opt);
 		diffcore_std(&opt);
-		for (i = 0; sb && i < diff_queued_diff.nr; i++) {
+		for (int i = 0; sb && i < diff_queued_diff.nr; i++) {
 			if (i)
 				strbuf_addch(sb, ' ');
 			strbuf_addstr(sb, diff_queued_diff.queue[i]->two->path);
@@ -2580,7 +2569,7 @@ int repo_index_has_changes(struct repository *repo,
 	} else {
 		/* TODO: audit for interaction with sparse-index. */
 		ensure_full_index(istate);
-		for (i = 0; sb && i < istate->cache_nr; i++) {
+		for (int i = 0; sb && i < istate->cache_nr; i++) {
 			if (i)
 				strbuf_addch(sb, ' ');
 			strbuf_addstr(sb, istate->cache[i]->name);
@@ -2782,9 +2771,7 @@ static int repo_verify_index(struct repository *repo)
 int has_racy_timestamp(struct index_state *istate)
 {
 	int entries = istate->cache_nr;
-	int i;
-
-	for (i = 0; i < entries; i++) {
+	for (int i = 0; i < entries; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		if (is_racy_timestamp(istate, ce))
 			return 1;
@@ -3421,12 +3408,11 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
 int repo_read_index_unmerged(struct repository *repo)
 {
 	struct index_state *istate;
-	int i;
 	int unmerged = 0;
 
 	repo_read_index(repo);
 	istate = repo->index;
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		struct cache_entry *new_ce;
 		int len;
@@ -3485,16 +3471,7 @@ void *read_blob_data_from_index(struct index_state *istate,
 
 	len = strlen(path);
 	pos = index_name_pos(istate, path, len);
-	if (pos < 0) {
-		/*
-		 * We might be in the middle of a merge, in which
-		 * case we would read stage #2 (ours).
-		 */
-		int i;
-		for (i = -pos - 1;
-		     (pos < 0 && i < istate->cache_nr &&
-		      !strcmp(istate->cache[i]->name, path));
-		     i++)
+	if (pos < 0) {for (int i = -pos - 1; (pos < 0 && i < istate->cache_nr && !strcmp(istate->cache[i]->name, path)); i++)
 			if (ce_stage(istate->cache[i]) == 2)
 				pos = i;
 	}
@@ -3667,7 +3644,7 @@ static struct index_entry_offset_table *read_ieot_extension(const char *mmap, si
 	const char *index = NULL;
 	uint32_t extsize, ext_version;
 	struct index_entry_offset_table *ieot;
-	int i, nr;
+	int nr;
 
 	/* find the IEOT extension */
 	if (!offset)
@@ -3701,7 +3678,7 @@ static struct index_entry_offset_table *read_ieot_extension(const char *mmap, si
 	ieot = xmalloc(sizeof(struct index_entry_offset_table)
 		       + (nr * sizeof(struct index_entry_offset)));
 	ieot->nr = nr;
-	for (i = 0; i < nr; i++) {
+	for (int i = 0; i < nr; i++) {
 		ieot->entries[i].offset = get_be32(index);
 		index += sizeof(uint32_t);
 		ieot->entries[i].nr = get_be32(index);
@@ -3714,14 +3691,13 @@ static struct index_entry_offset_table *read_ieot_extension(const char *mmap, si
 static void write_ieot_extension(struct strbuf *sb, struct index_entry_offset_table *ieot)
 {
 	uint32_t buffer;
-	int i;
 
 	/* version */
 	put_be32(&buffer, IEOT_VERSION);
 	strbuf_add(sb, &buffer, sizeof(uint32_t));
 
 	/* ieot */
-	for (i = 0; i < ieot->nr; i++) {
+	for (int i = 0; i < ieot->nr; i++) {
 
 		/* offset */
 		put_be32(&buffer, ieot->entries[i].offset);
@@ -3736,10 +3712,9 @@ static void write_ieot_extension(struct strbuf *sb, struct index_entry_offset_ta
 void prefetch_cache_entries(const struct index_state *istate,
 			    must_prefetch_predicate must_prefetch)
 {
-	int i;
 	struct oid_array to_fetch = OID_ARRAY_INIT;
 
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 
 		if (S_ISGITLINK(ce->ce_mode) || !must_prefetch(ce))
@@ -3923,10 +3898,9 @@ static int fix_unmerged_status(struct diff_filepair *p,
 static void update_callback(struct diff_queue_struct *q,
 			    struct diff_options *opt UNUSED, void *cbdata)
 {
-	int i;
 	struct update_callback_data *data = cbdata;
 
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		const char *path = p->one->path;
 
diff --git a/ref-filter.c b/ref-filter.c
index be14b56e32..39bbee303f 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -413,7 +413,6 @@ static int remote_ref_atom_parser(struct ref_format *format UNUSED,
 				  const char *arg, struct strbuf *err)
 {
 	struct string_list params = STRING_LIST_INIT_DUP;
-	int i;
 
 	if (!strcmp(atom->name, "push") || starts_with(atom->name, "push:"))
 		atom->u.remote_ref.push = 1;
@@ -427,7 +426,7 @@ static int remote_ref_atom_parser(struct ref_format *format UNUSED,
 	atom->u.remote_ref.nobracket = 0;
 	string_list_split(&params, arg, ',', -1);
 
-	for (i = 0; i < params.nr; i++) {
+	for (int i = 0; i < params.nr; i++) {
 		const char *s = params.items[i].string;
 
 		if (!strcmp(s, "track"))
@@ -800,7 +799,6 @@ static int align_atom_parser(struct ref_format *format UNUSED,
 {
 	struct align *align = &atom->u.align;
 	struct string_list params = STRING_LIST_INIT_DUP;
-	int i;
 	unsigned int width = ~0U;
 
 	if (!arg)
@@ -809,7 +807,7 @@ static int align_atom_parser(struct ref_format *format UNUSED,
 	align->position = ALIGN_LEFT;
 
 	string_list_split(&params, arg, ',', -1);
-	for (i = 0; i < params.nr; i++) {
+	for (int i = 0; i < params.nr; i++) {
 		const char *s = params.items[i].string;
 		int position;
 
@@ -1408,9 +1406,7 @@ static int grab_oid(const char *name, const char *field, const struct object_id
 /* See grab_values */
 static void grab_common_values(struct atom_value *val, int deref, struct expand_data *oi)
 {
-	int i;
-
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		const char *name = used_atom[i].name;
 		enum atom_type atom_type = used_atom[i].atom_type;
 		struct atom_value *v = &val[i];
@@ -1438,10 +1434,9 @@ static void grab_common_values(struct atom_value *val, int deref, struct expand_
 /* See grab_values */
 static void grab_tag_values(struct atom_value *val, int deref, struct object *obj)
 {
-	int i;
 	struct tag *tag = (struct tag *) obj;
 
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		const char *name = used_atom[i].name;
 		enum atom_type atom_type = used_atom[i].atom_type;
 		struct atom_value *v = &val[i];
@@ -1461,10 +1456,9 @@ static void grab_tag_values(struct atom_value *val, int deref, struct object *ob
 /* See grab_values */
 static void grab_commit_values(struct atom_value *val, int deref, struct object *obj)
 {
-	int i;
 	struct commit *commit = (struct commit *) obj;
 
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		const char *name = used_atom[i].name;
 		enum atom_type atom_type = used_atom[i].atom_type;
 		struct atom_value *v = &val[i];
@@ -1519,8 +1513,7 @@ static const char *copy_line(const char *buf)
 
 static const char *copy_name(const char *buf)
 {
-	const char *cp;
-	for (cp = buf; *cp && *cp != '\n'; cp++) {
+	for (const char *cp = buf; *cp && *cp != '\n'; cp++) {
 		if (starts_with(cp, " <"))
 			return xmemdupz(buf, cp - buf);
 	}
@@ -1578,9 +1571,7 @@ static const char *copy_email(const char *buf, struct used_atom *atom)
 static char *copy_subject(const char *buf, unsigned long len)
 {
 	struct strbuf sb = STRBUF_INIT;
-	int i;
-
-	for (i = 0; i < len; i++) {
+	for (int i = 0; i < len; i++) {
 		if (buf[i] == '\r' && i + 1 < len && buf[i + 1] == '\n')
 			continue; /* ignore CR in CRLF */
 
@@ -1720,12 +1711,11 @@ static void grab_person(const char *who, struct atom_value *val, int deref, void
 
 static void grab_signature(struct atom_value *val, int deref, struct object *obj)
 {
-	int i;
 	struct commit *commit = (struct commit *) obj;
 	struct signature_check sigc = { 0 };
 	int signature_checked = 0;
 
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		struct used_atom *atom = &used_atom[i];
 		const char *name = atom->name;
 		struct atom_value *v = &val[i];
@@ -1864,13 +1854,12 @@ static void find_subpos(const char *buf,
  */
 static void append_lines(struct strbuf *out, const char *buf, unsigned long size, int lines)
 {
-	int i;
 	const char *sp, *eol;
 	size_t len;
 
 	sp = buf;
 
-	for (i = 0; i < lines && sp < buf + size; i++) {
+	for (int i = 0; i < lines && sp < buf + size; i++) {
 		if (i)
 			strbuf_addstr(out, "\n    ");
 		eol = memchr(sp, '\n', size - (sp - buf));
@@ -1886,9 +1875,7 @@ static void grab_describe_values(struct atom_value *val, int deref,
 				 struct object *obj)
 {
 	struct commit *commit = (struct commit *)obj;
-	int i;
-
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		struct used_atom *atom = &used_atom[i];
 		enum atom_type type = atom->atom_type;
 		const char *name = atom->name;
@@ -1923,12 +1910,11 @@ static void grab_describe_values(struct atom_value *val, int deref,
 /* See grab_values */
 static void grab_sub_body_contents(struct atom_value *val, int deref, struct expand_data *data)
 {
-	int i;
 	const char *subpos = NULL, *bodypos = NULL, *sigpos = NULL;
 	size_t sublen = 0, bodylen = 0, nonsiglen = 0, siglen = 0;
 	void *buf = data->content;
 
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		struct used_atom *atom = &used_atom[i];
 		const char *name = atom->name;
 		struct atom_value *v = &val[i];
@@ -2007,8 +1993,7 @@ static void grab_sub_body_contents(struct atom_value *val, int deref, struct exp
  */
 static void fill_missing_values(struct atom_value *val)
 {
-	int i;
-	for (i = 0; i < used_atom_cnt; i++) {
+	for (int i = 0; i < used_atom_cnt; i++) {
 		struct atom_value *v = &val[i];
 		if (!v->s)
 			v->s = xstrdup("");
@@ -2282,9 +2267,7 @@ static int get_object(struct ref_array_item *ref, int deref, struct object **obj
 
 static void populate_worktree_map(struct hashmap *map, struct worktree **worktrees)
 {
-	int i;
-
-	for (i = 0; worktrees[i]; i++) {
+	for (int i = 0; worktrees[i]; i++) {
 		if (worktrees[i]->head_ref) {
 			struct ref_to_worktree_entry *entry;
 			entry = xmalloc(sizeof(*entry));
@@ -2731,8 +2714,6 @@ struct ref_array_item *ref_array_push(struct ref_array *array,
 
 static int ref_kind_from_refname(const char *refname)
 {
-	unsigned int i;
-
 	static struct {
 		const char *prefix;
 		unsigned int kind;
@@ -2745,7 +2726,7 @@ static int ref_kind_from_refname(const char *refname)
 	if (!strcmp(refname, "HEAD"))
 		return FILTER_REFS_DETACHED_HEAD;
 
-	for (i = 0; i < ARRAY_SIZE(ref_kind); i++) {
+	for (unsigned int i = 0; i < ARRAY_SIZE(ref_kind); i++) {
 		if (starts_with(refname, ref_kind[i].prefix))
 			return ref_kind[i].kind;
 	}
@@ -2852,8 +2833,7 @@ static void free_array_item(struct ref_array_item *item)
 {
 	free((char *)item->symref);
 	if (item->value) {
-		int i;
-		for (i = 0; i < used_atom_cnt; i++)
+		for (int i = 0; i < used_atom_cnt; i++)
 			free((char *)item->value[i].s);
 		free(item->value);
 	}
diff --git a/reflog-walk.c b/reflog-walk.c
index d216f6f966..ae25b5bbb4 100644
--- a/reflog-walk.c
+++ b/reflog-walk.c
@@ -41,12 +41,10 @@ static int read_one_reflog(struct object_id *ooid, struct object_id *noid,
 
 static void free_complete_reflog(struct complete_reflogs *array)
 {
-	int i;
-
 	if (!array)
 		return;
 
-	for (i = 0; i < array->nr; i++) {
+	for (int i = 0; i < array->nr; i++) {
 		free(array->items[i].email);
 		free(array->items[i].message);
 	}
@@ -94,8 +92,7 @@ static struct complete_reflogs *read_complete_reflog(const char *ref)
 static int get_reflog_recno_by_time(struct complete_reflogs *array,
 	timestamp_t timestamp)
 {
-	int i;
-	for (i = array->nr - 1; i >= 0; i--)
+	for (int i = array->nr - 1; i >= 0; i--)
 		if (timestamp >= array->items[i].timestamp)
 			return i;
 	return -1;
@@ -126,12 +123,10 @@ void init_reflog_walk(struct reflog_walk_info **info)
 
 void reflog_walk_info_release(struct reflog_walk_info *info)
 {
-	size_t i;
-
 	if (!info)
 		return;
 
-	for (i = 0; i < info->nr; i++)
+	for (size_t i = 0; i < info->nr; i++)
 		free(info->logs[i]);
 	string_list_clear_func(&info->complete_reflogs,
 			       complete_reflogs_clear);
@@ -345,9 +340,7 @@ struct commit *next_reflog_entry(struct reflog_walk_info *walk)
 {
 	struct commit_reflog *best = NULL;
 	struct commit *best_commit = NULL;
-	size_t i;
-
-	for (i = 0; i < walk->nr; i++) {
+	for (size_t i = 0; i < walk->nr; i++) {
 		struct commit_reflog *log = walk->logs[i];
 		struct commit *commit = next_reflog_commit(log);
 
diff --git a/refs.c b/refs.c
index fff343c256..a8c7a86e4c 100644
--- a/refs.c
+++ b/refs.c
@@ -648,11 +648,10 @@ static const char *ref_rev_parse_rules[] = {
  */
 int refname_match(const char *abbrev_name, const char *full_name)
 {
-	const char **p;
 	const int abbrev_name_len = strlen(abbrev_name);
 	const int num_rules = NUM_REV_PARSE_RULES;
 
-	for (p = ref_rev_parse_rules; *p; p++)
+	for (const char **p = ref_rev_parse_rules; *p; p++)
 		if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name)))
 			return &ref_rev_parse_rules[num_rules] - p;
 
@@ -665,10 +664,9 @@ int refname_match(const char *abbrev_name, const char *full_name)
  */
 void expand_ref_prefix(struct strvec *prefixes, const char *prefix)
 {
-	const char **p;
 	int len = strlen(prefix);
 
-	for (p = ref_rev_parse_rules; *p; p++)
+	for (const char **p = ref_rev_parse_rules; *p; p++)
 		strvec_pushf(prefixes, *p, len, prefix);
 }
 
@@ -759,12 +757,12 @@ int repo_dwim_ref(struct repository *r, const char *str, int len,
 int expand_ref(struct repository *repo, const char *str, int len,
 	       struct object_id *oid, char **ref)
 {
-	const char **p, *r;
+	const char *r;
 	int refs_found = 0;
 	struct strbuf fullref = STRBUF_INIT;
 
 	*ref = NULL;
-	for (p = ref_rev_parse_rules; *p; p++) {
+	for (const char **p = ref_rev_parse_rules; *p; p++) {
 		struct object_id oid_from_ref;
 		struct object_id *this_result;
 		int flag;
@@ -796,12 +794,11 @@ int repo_dwim_log(struct repository *r, const char *str, int len,
 {
 	struct ref_store *refs = get_main_ref_store(r);
 	char *last_branch = substitute_branch_name(r, &str, &len, 0);
-	const char **p;
 	int logs_found = 0;
 	struct strbuf path = STRBUF_INIT;
 
 	*log = NULL;
-	for (p = ref_rev_parse_rules; *p; p++) {
+	for (const char **p = ref_rev_parse_rules; *p; p++) {
 		struct object_id hash;
 		const char *ref, *it;
 
@@ -846,9 +843,7 @@ int is_per_worktree_ref(const char *refname)
 
 static int is_pseudoref_syntax(const char *refname)
 {
-	const char *c;
-
-	for (c = refname; *c; c++) {
+	for (const char *c = refname; *c; c++) {
 		if (!isupper(*c) && *c != '-' && *c != '_')
 			return 0;
 	}
@@ -1161,8 +1156,6 @@ struct ref_transaction *ref_transaction_begin(struct strbuf *err)
 
 void ref_transaction_free(struct ref_transaction *transaction)
 {
-	size_t i;
-
 	if (!transaction)
 		return;
 
@@ -1179,7 +1172,7 @@ void ref_transaction_free(struct ref_transaction *transaction)
 		break;
 	}
 
-	for (i = 0; i < transaction->nr; i++) {
+	for (size_t i = 0; i < transaction->nr; i++) {
 		free(transaction->updates[i]->msg);
 		free(transaction->updates[i]);
 	}
@@ -1377,11 +1370,10 @@ static const char *match_parse_rule(const char *refname, const char *rule,
 char *refs_shorten_unambiguous_ref(struct ref_store *refs,
 				   const char *refname, int strict)
 {
-	int i;
 	struct strbuf resolved_buf = STRBUF_INIT;
 
 	/* skip first rule, it will always match */
-	for (i = NUM_REV_PARSE_RULES - 1; i > 0 ; --i) {
+	for (int i = NUM_REV_PARSE_RULES - 1; i > 0; --i) {
 		int j;
 		int rules_to_fail = i;
 		const char *short_name;
@@ -1468,9 +1460,7 @@ int parse_hide_refs_config(const char *var, const char *value, const char *secti
 int ref_is_hidden(const char *refname, const char *refname_full,
 		  const struct strvec *hide_refs)
 {
-	int i;
-
-	for (i = hide_refs->nr - 1; i >= 0; i--) {
+	for (int i = hide_refs->nr - 1; i >= 0; i--) {
 		const char *match = hide_refs->v[i];
 		const char *subject;
 		int neg = 0;
@@ -1499,8 +1489,7 @@ int ref_is_hidden(const char *refname, const char *refname_full,
 
 const char **hidden_refs_to_excludes(const struct strvec *hide_refs)
 {
-	const char **pattern;
-	for (pattern = hide_refs->v; *pattern; pattern++) {
+	for (const char **pattern = hide_refs->v; *pattern; pattern++) {
 		/*
 		 * We can't feed any excludes from hidden refs config
 		 * sections, since later rules may override previous
@@ -1525,8 +1514,6 @@ const char *find_descendant_ref(const char *dirname,
 				const struct string_list *extras,
 				const struct string_list *skip)
 {
-	int pos;
-
 	if (!extras)
 		return NULL;
 
@@ -1536,8 +1523,7 @@ const char *find_descendant_ref(const char *dirname,
 	 * with dirname (remember, dirname includes the trailing
 	 * slash) and is not in skip, then we have a conflict.
 	 */
-	for (pos = string_list_find_insert_index(extras, dirname, 0);
-	     pos < extras->nr; pos++) {
+	for (int pos = string_list_find_insert_index(extras, dirname, 0); pos < extras->nr; pos++) {
 		const char *extra_refname = extras->items[pos].string;
 
 		if (!starts_with(extra_refname, dirname))
@@ -1859,9 +1845,7 @@ static int is_special_ref(const char *refname)
 		"FETCH_HEAD",
 		"MERGE_HEAD",
 	};
-	size_t i;
-
-	for (i = 0; i < ARRAY_SIZE(special_refs); i++)
+	for (size_t i = 0; i < ARRAY_SIZE(special_refs); i++)
 		if (!strcmp(refname, special_refs[i]))
 			return 1;
 
@@ -1896,7 +1880,6 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
 	static struct strbuf sb_refname = STRBUF_INIT;
 	struct object_id unused_oid;
 	int unused_flags;
-	int symref_count;
 
 	if (!oid)
 		oid = &unused_oid;
@@ -1921,7 +1904,7 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs,
 		*flags |= REF_BAD_NAME;
 	}
 
-	for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
+	for (int symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
 		unsigned int read_flags = 0;
 		int failure_errno;
 
@@ -2252,11 +2235,11 @@ int create_symref(const char *ref_target, const char *refs_heads_master,
 int ref_update_reject_duplicates(struct string_list *refnames,
 				 struct strbuf *err)
 {
-	size_t i, n = refnames->nr;
+	size_t n = refnames->nr;
 
 	assert(err);
 
-	for (i = 1; i < n; i++) {
+	for (size_t i = 1; i < n; i++) {
 		int cmp = strcmp(refnames->items[i - 1].string,
 				 refnames->items[i].string);
 
@@ -2278,7 +2261,7 @@ static int run_transaction_hook(struct ref_transaction *transaction,
 	struct child_process proc = CHILD_PROCESS_INIT;
 	struct strbuf buf = STRBUF_INIT;
 	const char *hook;
-	int ret = 0, i;
+	int ret = 0;
 
 	hook = find_hook("reference-transaction");
 	if (!hook)
@@ -2295,7 +2278,7 @@ static int run_transaction_hook(struct ref_transaction *transaction,
 
 	sigchain_push(SIGPIPE, SIG_IGN);
 
-	for (i = 0; i < transaction->nr; i++) {
+	for (int i = 0; i < transaction->nr; i++) {
 		struct ref_update *update = transaction->updates[i];
 
 		strbuf_reset(&buf);
@@ -2425,7 +2408,6 @@ int refs_verify_refname_available(struct ref_store *refs,
 				  const struct string_list *skip,
 				  struct strbuf *err)
 {
-	const char *slash;
 	const char *extra_refname;
 	struct strbuf dirname = STRBUF_INIT;
 	struct strbuf referent = STRBUF_INIT;
@@ -2443,7 +2425,7 @@ int refs_verify_refname_available(struct ref_store *refs,
 	assert(err);
 
 	strbuf_grow(&dirname, strlen(refname) + 1);
-	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+	for (const char *slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
 		/*
 		 * Just saying "Is a directory" when we e.g. can't
 		 * lock some multi-level ref isn't very informative,
@@ -2631,9 +2613,7 @@ void ref_transaction_for_each_queued_update(struct ref_transaction *transaction,
 					    ref_transaction_for_each_queued_update_fn cb,
 					    void *cb_data)
 {
-	int i;
-
-	for (i = 0; i < transaction->nr; i++) {
+	for (int i = 0; i < transaction->nr; i++) {
 		struct ref_update *update = transaction->updates[i];
 
 		cb(update->refname,
diff --git a/refs/debug.c b/refs/debug.c
index 634681ca44..a3e028d7c6 100644
--- a/refs/debug.c
+++ b/refs/debug.c
@@ -76,9 +76,8 @@ static void print_update(int i, const char *refname,
 
 static void print_transaction(struct ref_transaction *transaction)
 {
-	int i;
 	trace_printf_key(&trace_refs, "transaction {\n");
-	for (i = 0; i < transaction->nr; i++) {
+	for (int i = 0; i < transaction->nr; i++) {
 		struct ref_update *u = transaction->updates[i];
 		print_update(i, u->refname, &u->old_oid, &u->new_oid, u->flags,
 			     u->type, u->msg);
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 75dcc21ecb..be97d40422 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -210,12 +210,11 @@ static void files_ref_path(struct files_ref_store *refs,
 static void add_per_worktree_entries_to_dir(struct ref_dir *dir, const char *dirname)
 {
 	const char *prefixes[] = { "refs/bisect/", "refs/worktree/", "refs/rewritten/" };
-	int ip;
 
 	if (strcmp(dirname, "refs/"))
 		return;
 
-	for (ip = 0; ip < ARRAY_SIZE(prefixes); ip++) {
+	for (int ip = 0; ip < ARRAY_SIZE(prefixes); ip++) {
 		const char *prefix = prefixes[ip];
 		int prefix_len = strlen(prefix);
 		struct ref_entry *child_entry;
@@ -1089,11 +1088,10 @@ static void try_remove_empty_parents(struct files_ref_store *refs,
 	struct strbuf buf = STRBUF_INIT;
 	struct strbuf sb = STRBUF_INIT;
 	char *p, *q;
-	int i;
 
 	strbuf_addstr(&buf, refname);
 	p = buf.buf;
-	for (i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
+	for (int i = 0; i < 2; i++) { /* refs/{heads,tags,...}/ */
 		while (*p && *p != '/')
 			p++;
 		/* tolerate duplicate slashes; see check_refname_format() */
@@ -2515,8 +2513,6 @@ static int lock_ref_for_update(struct files_ref_store *refs,
 				goto out;
 		}
 	} else {
-		struct ref_update *parent_update;
-
 		if (check_old_oid(update, &lock->old_oid, err)) {
 			ret = TRANSACTION_GENERIC_ERROR;
 			goto out;
@@ -2527,9 +2523,7 @@ static int lock_ref_for_update(struct files_ref_store *refs,
 		 * symref update, record the old OID in the parent
 		 * update:
 		 */
-		for (parent_update = update->parent_update;
-		     parent_update;
-		     parent_update = parent_update->parent_update) {
+		for (struct ref_update *parent_update = update->parent_update; parent_update; parent_update = parent_update->parent_update) {
 			struct ref_lock *parent_lock = parent_update->backend_data;
 			oidcpy(&parent_lock->old_oid, &lock->old_oid);
 		}
@@ -2596,12 +2590,11 @@ struct files_transaction_backend_data {
 static void files_transaction_cleanup(struct files_ref_store *refs,
 				      struct ref_transaction *transaction)
 {
-	size_t i;
 	struct files_transaction_backend_data *backend_data =
 		transaction->backend_data;
 	struct strbuf err = STRBUF_INIT;
 
-	for (i = 0; i < transaction->nr; i++) {
+	for (size_t i = 0; i < transaction->nr; i++) {
 		struct ref_update *update = transaction->updates[i];
 		struct ref_lock *lock = update->backend_data;
 
diff --git a/refs/packed-backend.c b/refs/packed-backend.c
index a499a91c7e..96286e239c 100644
--- a/refs/packed-backend.c
+++ b/refs/packed-backend.c
@@ -990,8 +990,7 @@ static int jump_list_entry_cmp(const void *va, const void *vb)
 
 static int has_glob_special(const char *str)
 {
-	const char *p;
-	for (p = str; *p; p++) {
+	for (const char *p = str; *p; p++) {
 		if (is_glob_special(*p))
 			return 1;
 	}
@@ -1003,13 +1002,12 @@ static void populate_excluded_jump_list(struct packed_ref_iterator *iter,
 					const char **excluded_patterns)
 {
 	size_t i, j;
-	const char **pattern;
 	struct jump_list_entry *last_disjoint;
 
 	if (!excluded_patterns)
 		return;
 
-	for (pattern = excluded_patterns; *pattern; pattern++) {
+	for (const char **pattern = excluded_patterns; *pattern; pattern++) {
 		struct jump_list_entry *e;
 		const char *start, *end;
 
@@ -1589,7 +1587,6 @@ static int packed_transaction_prepare(struct ref_store *ref_store,
 			REF_STORE_READ | REF_STORE_WRITE | REF_STORE_ODB,
 			"ref_transaction_prepare");
 	struct packed_transaction_backend_data *data;
-	size_t i;
 	int ret = TRANSACTION_GENERIC_ERROR;
 
 	/*
@@ -1610,7 +1607,7 @@ static int packed_transaction_prepare(struct ref_store *ref_store,
 	 * Stick the updates in a string list by refname so that we
 	 * can sort them:
 	 */
-	for (i = 0; i < transaction->nr; i++) {
+	for (size_t i = 0; i < transaction->nr; i++) {
 		struct ref_update *update = transaction->updates[i];
 		struct string_list_item *item =
 			string_list_append(&data->updates, update->refname);
diff --git a/refs/ref-cache.c b/refs/ref-cache.c
index a372a00941..2dd2b70204 100644
--- a/refs/ref-cache.c
+++ b/refs/ref-cache.c
@@ -80,8 +80,7 @@ void free_ref_cache(struct ref_cache *cache)
  */
 static void clear_ref_dir(struct ref_dir *dir)
 {
-	int i;
-	for (i = 0; i < dir->nr; i++)
+	for (int i = 0; i < dir->nr; i++)
 		free_ref_entry(dir->entries[i]);
 	FREE_AND_NULL(dir->entries);
 	dir->sorted = dir->nr = dir->alloc = 0;
@@ -172,8 +171,7 @@ static struct ref_dir *search_for_subdir(struct ref_dir *dir,
 static struct ref_dir *find_containing_dir(struct ref_dir *dir,
 					   const char *refname)
 {
-	const char *slash;
-	for (slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
+	for (const char *slash = strchr(refname, '/'); slash; slash = strchr(slash + 1, '/')) {
 		size_t dirnamelen = slash - refname + 1;
 		struct ref_dir *subdir;
 		subdir = search_for_subdir(dir, refname, dirnamelen);
@@ -289,15 +287,7 @@ static enum prefix_state overlaps_prefix(const char *dirname,
  * `prefix` is NULL, prime unconditionally.
  */
 static void prime_ref_dir(struct ref_dir *dir, const char *prefix)
-{
-	/*
-	 * The hard work of loading loose refs is done by get_ref_dir(), so we
-	 * just need to recurse through all of the sub-directories. We do not
-	 * even need to care about sorting, as traversal order does not matter
-	 * to us.
-	 */
-	int i;
-	for (i = 0; i < dir->nr; i++) {
+{for (int i = 0; i < dir->nr; i++) {
 		struct ref_entry *entry = dir->entries[i];
 		if (!(entry->flag & REF_DIR)) {
 			/* Not a directory; no need to recurse. */
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index a14f2ad7f4..43c81c60da 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -687,14 +687,13 @@ static int prepare_transaction_update(struct write_transaction_table_arg **out,
 {
 	struct reftable_stack *stack = stack_for(refs, update->refname, NULL);
 	struct write_transaction_table_arg *arg = NULL;
-	size_t i;
 	int ret;
 
 	/*
 	 * Search for a preexisting stack update. If there is one then we add
 	 * the update to it, otherwise we set up a new stack update.
 	 */
-	for (i = 0; !arg && i < tx_data->args_nr; i++)
+	for (size_t i = 0; !arg && i < tx_data->args_nr; i++)
 		if (tx_data->args[i].stack == stack)
 			arg = &tx_data->args[i];
 
@@ -1380,7 +1379,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
 	struct reftable_iterator it = {0};
 	struct string_list skip = STRING_LIST_INIT_NODUP;
 	struct strbuf errbuf = STRBUF_INIT;
-	size_t logs_nr = 0, logs_alloc = 0, i;
+	size_t logs_nr = 0, logs_alloc = 0;
 	int ret;
 
 	if (reftable_stack_read_ref(arg->stack, arg->oldname, &old_ref)) {
@@ -1553,7 +1552,7 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
 	reftable_iterator_destroy(&it);
 	string_list_clear(&skip, 0);
 	strbuf_release(&errbuf);
-	for (i = 0; i < logs_nr; i++) {
+	for (size_t i = 0; i < logs_nr; i++) {
 		if (!strcmp(logs[i].refname, "HEAD"))
 			continue;
 		if (logs[i].value.update.old_hash == old_ref.value.val1)
diff --git a/refspec.c b/refspec.c
index d60932f4de..3c7b08158f 100644
--- a/refspec.c
+++ b/refspec.c
@@ -219,8 +219,7 @@ void refspec_appendf(struct refspec *rs, const char *fmt, ...)
 
 void refspec_appendn(struct refspec *rs, const char **refspecs, int nr)
 {
-	int i;
-	for (i = 0; i < nr; i++)
+	for (int i = 0; i < nr; i++)
 		refspec_append(rs, refspecs[i]);
 }
 
@@ -265,8 +264,7 @@ int valid_remote_name(const char *name)
 void refspec_ref_prefixes(const struct refspec *rs,
 			  struct strvec *ref_prefixes)
 {
-	int i;
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		const struct refspec_item *item = &rs->items[i];
 		const char *prefix = NULL;
 
diff --git a/reftable/basics.c b/reftable/basics.c
index 0785aff941..fd6205ceb6 100644
--- a/reftable/basics.c
+++ b/reftable/basics.c
@@ -54,11 +54,10 @@ int binsearch(size_t sz, int (*f)(size_t k, void *args), void *args)
 
 void free_names(char **a)
 {
-	char **p;
 	if (!a) {
 		return;
 	}
-	for (p = a; *p; p++) {
+	for (char **p = a; *p; p++) {
 		reftable_free(*p);
 	}
 	reftable_free(a);
diff --git a/reftable/block.c b/reftable/block.c
index 72eb73b380..c7363ab951 100644
--- a/reftable/block.c
+++ b/reftable/block.c
@@ -129,8 +129,7 @@ int block_writer_add(struct block_writer *w, struct reftable_record *rec)
 
 int block_writer_finish(struct block_writer *w)
 {
-	int i;
-	for (i = 0; i < w->restart_len; i++) {
+	for (int i = 0; i < w->restart_len; i++) {
 		put_be24(w->buf + w->next, w->restarts[i]);
 		w->next += 3;
 	}
diff --git a/reftable/merged_test.c b/reftable/merged_test.c
index d0f77a3b8f..095c6d68cb 100644
--- a/reftable/merged_test.c
+++ b/reftable/merged_test.c
@@ -142,7 +142,6 @@ static void test_merged_between(void)
 	struct reftable_reader **readers = NULL;
 	struct reftable_merged_table *mt =
 		merged_table_from_records(refs, &bs, &readers, sizes, bufs, 2);
-	int i;
 	struct reftable_ref_record ref = { NULL };
 	struct reftable_iterator it = { NULL };
 	int err = reftable_merged_table_seek_ref(mt, &it, "a");
@@ -155,7 +154,7 @@ static void test_merged_between(void)
 	reftable_iterator_destroy(&it);
 	readers_destroy(readers, 2);
 	reftable_merged_table_free(mt);
-	for (i = 0; i < ARRAY_SIZE(bufs); i++) {
+	for (int i = 0; i < ARRAY_SIZE(bufs); i++) {
 		strbuf_release(&bufs[i]);
 	}
 	reftable_free(bs);
diff --git a/reftable/pq_test.c b/reftable/pq_test.c
index c202eff848..15efd7ba96 100644
--- a/reftable/pq_test.c
+++ b/reftable/pq_test.c
@@ -17,8 +17,7 @@ license that can be found in the LICENSE file or at
 
 void merged_iter_pqueue_check(struct merged_iter_pqueue pq)
 {
-	int i;
-	for (i = 1; i < pq.len; i++) {
+	for (int i = 1; i < pq.len; i++) {
 		int parent = (i - 1) / 2;
 
 		EXPECT(pq_less(&pq.heap[parent], &pq.heap[i]));
diff --git a/reftable/readwrite_test.c b/reftable/readwrite_test.c
index 363fe0f998..2aa24a8ba9 100644
--- a/reftable/readwrite_test.c
+++ b/reftable/readwrite_test.c
@@ -119,7 +119,6 @@ static void test_log_buffer_size(void)
 		.block_size = 4096,
 	};
 	int err;
-	int i;
 	struct reftable_log_record
 		log = { .refname = "refs/heads/master",
 			.update_index = 0xa,
@@ -138,7 +137,7 @@ static void test_log_buffer_size(void)
 	   hash, to ensure that the compressed part is larger than the original.
 	*/
 	uint8_t hash1[GIT_SHA1_RAWSZ], hash2[GIT_SHA1_RAWSZ];
-	for (i = 0; i < GIT_SHA1_RAWSZ; i++) {
+	for (int i = 0; i < GIT_SHA1_RAWSZ; i++) {
 		hash1[i] = (uint8_t)(git_rand() % 256);
 		hash2[i] = (uint8_t)(git_rand() % 256);
 	}
@@ -301,7 +300,7 @@ static void test_log_zlib_corruption(void)
 	uint8_t hash1[GIT_SHA1_RAWSZ] = { 1 };
 	uint8_t hash2[GIT_SHA1_RAWSZ] = { 2 };
 	char message[100] = { 0 };
-	int err, i, n;
+	int err, n;
 
 	struct reftable_log_record log = {
 		.refname = "refname",
@@ -317,7 +316,7 @@ static void test_log_zlib_corruption(void)
 		},
 	};
 
-	for (i = 0; i < sizeof(message) - 1; i++)
+	for (int i = 0; i < sizeof(message) - 1; i++)
 		message[i] = (uint8_t)(git_rand() % 64 + ' ');
 
 	reftable_writer_set_limits(w, 1, 1);
@@ -412,7 +411,6 @@ static void test_table_read_api(void)
 	struct reftable_reader rd = { NULL };
 	struct reftable_block_source source = { NULL };
 	int err;
-	int i;
 	struct reftable_log_record log = { NULL };
 	struct reftable_iterator it = { NULL };
 
@@ -430,7 +428,7 @@ static void test_table_read_api(void)
 	EXPECT(err == REFTABLE_API_ERROR);
 
 	strbuf_release(&buf);
-	for (i = 0; i < N; i++) {
+	for (int i = 0; i < N; i++) {
 		reftable_free(names[i]);
 	}
 	reftable_iterator_destroy(&it);
@@ -675,13 +673,12 @@ static void test_write_object_id_min_length(void)
 		.value.val1 = {42},
 	};
 	int err;
-	int i;
 
 	reftable_writer_set_limits(w, 1, 1);
 
 	/* Write the same hash in many refs. If there is only 1 hash, the
 	 * disambiguating prefix is length 0 */
-	for (i = 0; i < 256; i++) {
+	for (int i = 0; i < 256; i++) {
 		char name[256];
 		snprintf(name, sizeof(name), "ref%05d", i);
 		ref.refname = name;
@@ -710,13 +707,12 @@ static void test_write_object_id_length(void)
 		.value.val1 = {42},
 	};
 	int err;
-	int i;
 
 	reftable_writer_set_limits(w, 1, 1);
 
 	/* Write the same hash in many refs. If there is only 1 hash, the
 	 * disambiguating prefix is length 0 */
-	for (i = 0; i < 256; i++) {
+	for (int i = 0; i < 256; i++) {
 		char name[256];
 		snprintf(name, sizeof(name), "ref%05d", i);
 		ref.refname = name;
diff --git a/reftable/record.c b/reftable/record.c
index d6bb42e887..2428746585 100644
--- a/reftable/record.c
+++ b/reftable/record.c
@@ -487,9 +487,7 @@ static void reftable_obj_record_print(const void *rec, int hash_size)
 	const struct reftable_obj_record *obj = rec;
 	char hex[GIT_MAX_HEXSZ + 1] = { 0 };
 	struct strbuf offset_str = STRBUF_INIT;
-	int i;
-
-	for (i = 0; i < obj->offset_len; i++)
+	for (int i = 0; i < obj->offset_len; i++)
 		strbuf_addf(&offset_str, "%" PRIu64 " ", obj->offsets[i]);
 	hex_format(hex, obj->hash_prefix, obj->hash_prefix_len);
 	printf("prefix %s (len %d), offsets [%s]\n",
diff --git a/reftable/record_test.c b/reftable/record_test.c
index a86cff5526..238a53bdc4 100644
--- a/reftable/record_test.c
+++ b/reftable/record_test.c
@@ -174,8 +174,6 @@ static void test_reftable_log_record_equal(void)
 
 static void test_reftable_log_record_roundtrip(void)
 {
-	int i;
-
 	struct reftable_log_record in[] = {
 		{
 			.refname = xstrdup("refs/heads/master"),
@@ -215,7 +213,7 @@ static void test_reftable_log_record_roundtrip(void)
 	set_test_hash(in[0].value.update.old_hash, 2);
 	set_test_hash(in[2].value.update.new_hash, 3);
 	set_test_hash(in[2].value.update.old_hash, 4);
-	for (i = 0; i < ARRAY_SIZE(in); i++) {
+	for (int i = 0; i < ARRAY_SIZE(in); i++) {
 		struct reftable_record rec = { .type = BLOCK_TYPE_LOG };
 		struct strbuf key = STRBUF_INIT;
 		uint8_t buffer[1024] = { 0 };
diff --git a/reftable/refname_test.c b/reftable/refname_test.c
index b9cc62554e..f00ad7684b 100644
--- a/reftable/refname_test.c
+++ b/reftable/refname_test.c
@@ -39,7 +39,6 @@ static void test_conflict(void)
 		.update_index = 1,
 	};
 	int err;
-	int i;
 	struct reftable_block_source source = { NULL };
 	struct reftable_reader *rd = NULL;
 	struct reftable_table tab = { NULL };
@@ -72,7 +71,7 @@ static void test_conflict(void)
 
 	reftable_table_from_reader(&tab, rd);
 
-	for (i = 0; i < ARRAY_SIZE(cases); i++) {
+	for (int i = 0; i < ARRAY_SIZE(cases); i++) {
 		struct modification mod = {
 			.tab = tab,
 		};
diff --git a/reftable/stack.c b/reftable/stack.c
index b64e55648a..76c3f5f508 100644
--- a/reftable/stack.c
+++ b/reftable/stack.c
@@ -608,9 +608,7 @@ static int reftable_stack_init_addition(struct reftable_addition *add,
 static void reftable_addition_close(struct reftable_addition *add)
 {
 	struct strbuf nm = STRBUF_INIT;
-	size_t i;
-
-	for (i = 0; i < add->new_tables_len; i++) {
+	for (size_t i = 0; i < add->new_tables_len; i++) {
 		stack_filename(&nm, add->stack, add->new_tables[i]);
 		unlink(nm.buf);
 		reftable_free(add->new_tables[i]);
@@ -1229,13 +1227,13 @@ struct segment *sizes_to_segments(size_t *seglen, uint64_t *sizes, size_t n)
 {
 	struct segment *segs = reftable_calloc(n, sizeof(*segs));
 	struct segment cur = { 0 };
-	size_t next = 0, i;
+	size_t next = 0;
 
 	if (n == 0) {
 		*seglen = 0;
 		return segs;
 	}
-	for (i = 0; i < n; i++) {
+	for (size_t i = 0; i < n; i++) {
 		int log = fastlog2(sizes[i]);
 		if (cur.log != log && cur.bytes > 0) {
 			struct segment fresh = {
@@ -1261,10 +1259,10 @@ struct segment suggest_compaction_segment(uint64_t *sizes, size_t n)
 		.log = 64,
 	};
 	struct segment *segs;
-	size_t seglen = 0, i;
+	size_t seglen = 0;
 
 	segs = sizes_to_segments(&seglen, sizes, n);
-	for (i = 0; i < seglen; i++) {
+	for (size_t i = 0; i < seglen; i++) {
 		if (segment_size(&segs[i]) == 1)
 			continue;
 
diff --git a/reftable/stack_test.c b/reftable/stack_test.c
index 509f486623..ca4258ce2d 100644
--- a/reftable/stack_test.c
+++ b/reftable/stack_test.c
@@ -294,12 +294,12 @@ static void test_reftable_stack_transaction_api_performs_auto_compaction(void)
 	struct reftable_write_options cfg = {0};
 	struct reftable_addition *add = NULL;
 	struct reftable_stack *st = NULL;
-	int i, n = 20, err;
+	int n = 20, err;
 
 	err = reftable_new_stack(&st, dir, cfg);
 	EXPECT_ERR(err);
 
-	for (i = 0; i <= n; i++) {
+	for (int i = 0; i <= n; i++) {
 		struct reftable_ref_record ref = {
 			.update_index = reftable_stack_next_update_index(st),
 			.value_type = REFTABLE_REF_SYMREF,
@@ -349,8 +349,6 @@ static void test_reftable_stack_validate_refname(void)
 	struct reftable_stack *st = NULL;
 	int err;
 	char *dir = get_tmp_dir(__LINE__);
-
-	int i;
 	struct reftable_ref_record ref = {
 		.refname = "a/b",
 		.update_index = 1,
@@ -365,7 +363,7 @@ static void test_reftable_stack_validate_refname(void)
 	err = reftable_stack_add(st, &write_test_ref, &ref);
 	EXPECT_ERR(err);
 
-	for (i = 0; i < ARRAY_SIZE(additions); i++) {
+	for (int i = 0; i < ARRAY_SIZE(additions); i++) {
 		struct reftable_ref_record ref = {
 			.refname = additions[i],
 			.update_index = 1,
@@ -424,11 +422,11 @@ static void test_reftable_stack_lock_failure(void)
 
 	struct reftable_write_options cfg = { 0 };
 	struct reftable_stack *st = NULL;
-	int err, i;
+	int err;
 
 	err = reftable_new_stack(&st, dir, cfg);
 	EXPECT_ERR(err);
-	for (i = -1; i != REFTABLE_EMPTY_TABLE_ERROR; i--) {
+	for (int i = -1; i != REFTABLE_EMPTY_TABLE_ERROR; i--) {
 		err = reftable_stack_add(st, &write_error, &i);
 		EXPECT(err == i);
 	}
@@ -890,14 +888,14 @@ static void test_reftable_stack_auto_compaction(void)
 	struct reftable_stack *st = NULL;
 	char *dir = get_tmp_dir(__LINE__);
 
-	int err, i;
+	int err;
 	int N = 100;
 
 	err = reftable_new_stack(&st, dir, cfg);
 	EXPECT_ERR(err);
 
 	st->disable_auto_compact = 1; /* call manually below for coverage. */
-	for (i = 0; i < N; i++) {
+	for (int i = 0; i < N; i++) {
 		char name[100];
 		struct reftable_ref_record ref = {
 			.refname = name,
@@ -928,12 +926,12 @@ static void test_reftable_stack_add_performs_auto_compaction(void)
 	struct reftable_stack *st = NULL;
 	struct strbuf refname = STRBUF_INIT;
 	char *dir = get_tmp_dir(__LINE__);
-	int err, i, n = 20;
+	int err, n = 20;
 
 	err = reftable_new_stack(&st, dir, cfg);
 	EXPECT_ERR(err);
 
-	for (i = 0; i <= n; i++) {
+	for (int i = 0; i <= n; i++) {
 		struct reftable_ref_record ref = {
 			.update_index = reftable_stack_next_update_index(st),
 			.value_type = REFTABLE_REF_SYMREF,
@@ -976,13 +974,13 @@ static void test_reftable_stack_compaction_concurrent(void)
 	struct reftable_stack *st1 = NULL, *st2 = NULL;
 	char *dir = get_tmp_dir(__LINE__);
 
-	int err, i;
+	int err;
 	int N = 3;
 
 	err = reftable_new_stack(&st1, dir, cfg);
 	EXPECT_ERR(err);
 
-	for (i = 0; i < N; i++) {
+	for (int i = 0; i < N; i++) {
 		char name[100];
 		struct reftable_ref_record ref = {
 			.refname = name,
@@ -1026,13 +1024,13 @@ static void test_reftable_stack_compaction_concurrent_clean(void)
 	struct reftable_stack *st1 = NULL, *st2 = NULL, *st3 = NULL;
 	char *dir = get_tmp_dir(__LINE__);
 
-	int err, i;
+	int err;
 	int N = 3;
 
 	err = reftable_new_stack(&st1, dir, cfg);
 	EXPECT_ERR(err);
 
-	for (i = 0; i < N; i++) {
+	for (int i = 0; i < N; i++) {
 		char name[100];
 		struct reftable_ref_record ref = {
 			.refname = name,
diff --git a/remote-curl.c b/remote-curl.c
index 1161dc7fed..07239e6759 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -563,13 +563,12 @@ static struct ref *get_refs(int for_push)
 
 static void output_refs(struct ref *refs)
 {
-	struct ref *posn;
 	if (options.object_format && options.hash_algo) {
 		printf(":object-format %s\n", options.hash_algo->name);
 		repo_set_hash_algo(the_repository,
 				hash_algo_by_ptr(options.hash_algo));
 	}
-	for (posn = refs; posn; posn = posn->next) {
+	for (struct ref *posn = refs; posn; posn = posn->next) {
 		if (posn->symref)
 			printf("@%s %s\n", posn->symref, posn->name);
 		else
@@ -1317,7 +1316,6 @@ static void parse_get(const char *arg)
 static int push_dav(int nr_spec, const char **specs)
 {
 	struct child_process child = CHILD_PROCESS_INIT;
-	size_t i;
 
 	child.git_cmd = 1;
 	strvec_push(&child.args, "http-push");
@@ -1327,7 +1325,7 @@ static int push_dav(int nr_spec, const char **specs)
 	if (options.verbosity > 1)
 		strvec_push(&child.args, "--verbose");
 	strvec_push(&child.args, url.buf);
-	for (i = 0; i < nr_spec; i++)
+	for (size_t i = 0; i < nr_spec; i++)
 		strvec_push(&child.args, specs[i]);
 
 	if (run_command(&child))
diff --git a/remote.c b/remote.c
index 9090632e96..1ad993e397 100644
--- a/remote.c
+++ b/remote.c
@@ -37,13 +37,13 @@ static int valid_remote(const struct remote *remote)
 
 static const char *alias_url(const char *url, struct rewrites *r)
 {
-	int i, j;
+	int j;
 	struct counted_string *longest;
 	int longest_i;
 
 	longest = NULL;
 	longest_i = -1;
-	for (i = 0; i < r->rewrite_nr; i++) {
+	for (int i = 0; i < r->rewrite_nr; i++) {
 		if (!r->rewrite[i])
 			continue;
 		for (j = 0; j < r->rewrite[i]->instead_of_nr; j++) {
@@ -244,9 +244,7 @@ static struct rewrite *make_rewrite(struct rewrites *r,
 				    const char *base, size_t len)
 {
 	struct rewrite *ret;
-	int i;
-
-	for (i = 0; i < r->rewrite_nr; i++) {
+	for (int i = 0; i < r->rewrite_nr; i++) {
 		if (len == r->rewrite[i]->baselen &&
 		    !strncmp(base, r->rewrite[i]->base, len))
 			return r->rewrite[i];
@@ -484,8 +482,8 @@ static int handle_config(const char *key, const char *value,
 
 static void alias_all_urls(struct remote_state *remote_state)
 {
-	int i, j;
-	for (i = 0; i < remote_state->remotes_nr; i++) {
+	int j;
+	for (int i = 0; i < remote_state->remotes_nr; i++) {
 		int add_pushurl_aliases;
 		if (!remote_state->remotes[i])
 			continue;
@@ -625,7 +623,6 @@ const char *remote_ref_for_branch(struct branch *branch, int for_push)
 
 static void validate_remote_url(struct remote *remote)
 {
-	int i;
 	const char *value;
 	struct strbuf redacted = STRBUF_INIT;
 	int warn_not_die;
@@ -642,7 +639,7 @@ static void validate_remote_url(struct remote *remote)
 	else
 		die(_("unrecognized value transfer.credentialsInUrl: '%s'"), value);
 
-	for (i = 0; i < remote->url_nr; i++) {
+	for (int i = 0; i < remote->url_nr; i++) {
 		struct url_info url_info = { 0 };
 
 		if (!url_normalize(remote->url[i], &url_info) ||
@@ -741,10 +738,9 @@ int remote_is_configured(struct remote *remote, int in_repo)
 
 int for_each_remote(each_remote_fn fn, void *priv)
 {
-	int i, result = 0;
+	int result = 0;
 	read_config(the_repository, 0);
-	for (i = 0; i < the_repository->remote_state->remotes_nr && !result;
-	     i++) {
+	for (int i = 0; i < the_repository->remote_state->remotes_nr && !result; i++) {
 		struct remote *remote =
 			the_repository->remote_state->remotes[i];
 		if (!remote)
@@ -818,8 +814,7 @@ struct ref *ref_remove_duplicates(struct ref *ref_map)
 
 int remote_has_url(struct remote *remote, const char *url)
 {
-	int i;
-	for (i = 0; i < remote->url_nr; i++) {
+	for (int i = 0; i < remote->url_nr; i++) {
 		if (!strcmp(remote->url[i], url))
 			return 1;
 	}
@@ -865,9 +860,7 @@ static int refspec_match(const struct refspec_item *refspec,
 
 int omit_name_by_refspec(const char *name, struct refspec *rs)
 {
-	int i;
-
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		if (rs->items[i].negative && refspec_match(&rs->items[i], name))
 			return 1;
 	}
@@ -953,7 +946,6 @@ static void query_refspecs_multiple(struct refspec *rs,
 				    struct refspec_item *query,
 				    struct string_list *results)
 {
-	int i;
 	int find_src = !query->src;
 
 	if (find_src && !query->dst)
@@ -962,7 +954,7 @@ static void query_refspecs_multiple(struct refspec *rs,
 	if (query_matches_negative_refspec(rs, query))
 		return;
 
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		struct refspec_item *refspec = &rs->items[i];
 		const char *key = find_src ? refspec->dst : refspec->src;
 		const char *value = find_src ? refspec->src : refspec->dst;
@@ -982,7 +974,6 @@ static void query_refspecs_multiple(struct refspec *rs,
 
 int query_refspecs(struct refspec *rs, struct refspec_item *query)
 {
-	int i;
 	int find_src = !query->src;
 	const char *needle = find_src ? query->dst : query->src;
 	char **result = find_src ? &query->src : &query->dst;
@@ -993,7 +984,7 @@ int query_refspecs(struct refspec *rs, struct refspec_item *query)
 	if (query_matches_negative_refspec(rs, query))
 		return -1;
 
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		struct refspec_item *refspec = &rs->items[i];
 		const char *key = find_src ? refspec->dst : refspec->src;
 		const char *value = find_src ? refspec->src : refspec->dst;
@@ -1366,8 +1357,8 @@ static int match_explicit(struct ref *src, struct ref *dst,
 static int match_explicit_refs(struct ref *src, struct ref *dst,
 			       struct ref ***dst_tail, struct refspec *rs)
 {
-	int i, errs;
-	for (i = errs = 0; i < rs->nr; i++)
+	int errs;
+	for (int i = errs = 0; i < rs->nr; i++)
 		errs += match_explicit(src, dst, dst_tail, &rs->items[i]);
 	return errs;
 }
@@ -1378,9 +1369,8 @@ static char *get_ref_match(const struct refspec *rs, const struct ref *ref,
 {
 	const struct refspec_item *pat;
 	char *name;
-	int i;
 	int matching_refs = -1;
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		const struct refspec_item *item = &rs->items[i];
 
 		if (item->negative)
@@ -1586,9 +1576,7 @@ static void prepare_ref_index(struct string_list *ref_index, struct ref *ref)
 int check_push_refs(struct ref *src, struct refspec *rs)
 {
 	int ret = 0;
-	int i;
-
-	for (i = 0; i < rs->nr; i++) {
+	for (int i = 0; i < rs->nr; i++) {
 		struct refspec_item *item = &rs->items[i];
 
 		if (item->pattern || item->matching || item->negative)
@@ -1703,9 +1691,7 @@ int match_push_refs(struct ref *src, struct ref **dst,
 void set_ref_status_for_push(struct ref *remote_refs, int send_mirror,
 			     int force_update)
 {
-	struct ref *ref;
-
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (struct ref *ref = remote_refs; ref; ref = ref->next) {
 		int force_ref_update = ref->force || force_update;
 		int reject_reason = 0;
 
@@ -1798,7 +1784,6 @@ static void set_merge(struct remote_state *remote_state, struct branch *ret)
 	struct remote *remote;
 	char *ref;
 	struct object_id oid;
-	int i;
 
 	if (!ret)
 		return; /* no branch */
@@ -1816,7 +1801,7 @@ static void set_merge(struct remote_state *remote_state, struct branch *ret)
 	remote = remotes_remote_get(remote_state, ret->remote_name);
 
 	CALLOC_ARRAY(ret->merge, ret->merge_nr);
-	for (i = 0; i < ret->merge_nr; i++) {
+	for (int i = 0; i < ret->merge_nr; i++) {
 		ret->merge[i] = xcalloc(1, sizeof(**ret->merge));
 		ret->merge[i]->src = xstrdup(ret->merge_name[i]);
 		if (!remote_find_tracking(remote, ret->merge[i]) ||
@@ -2005,11 +1990,10 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
 				    const struct refspec_item *refspec)
 {
 	struct strbuf scratch = STRBUF_INIT;
-	const struct ref *ref;
 	struct ref *ret = NULL;
 	struct ref **tail = &ret;
 
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (const struct ref *ref = remote_refs; ref; ref = ref->next) {
 		char *expn_name = NULL;
 
 		strbuf_reset(&scratch);
@@ -2036,11 +2020,10 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
 
 static const struct ref *find_ref_by_name_abbrev(const struct ref *refs, const char *name)
 {
-	const struct ref *ref;
 	const struct ref *best_match = NULL;
 	int best_score = 0;
 
-	for (ref = refs; ref; ref = ref->next) {
+	for (const struct ref *ref = refs; ref; ref = ref->next) {
 		int score = refname_match(name, ref->name);
 
 		if (best_score < score) {
@@ -2424,7 +2407,7 @@ static int get_stale_heads_cb(const char *refname, const struct object_id *oid,
 	struct stale_heads_info *info = cb_data;
 	struct string_list matches = STRING_LIST_INIT_DUP;
 	struct refspec_item query;
-	int i, stale = 1;
+	int stale = 1;
 	memset(&query, 0, sizeof(struct refspec_item));
 	query.dst = (char *)refname;
 
@@ -2442,7 +2425,7 @@ static int get_stale_heads_cb(const char *refname, const struct object_id *oid,
 	if (flags & REF_ISSYMREF)
 		goto clean_exit;
 
-	for (i = 0; stale && i < matches.nr; i++)
+	for (int i = 0; stale && i < matches.nr; i++)
 		if (string_list_has_string(info->ref_names, matches.items[i].string))
 			stale = 0;
 
@@ -2458,14 +2441,14 @@ static int get_stale_heads_cb(const char *refname, const struct object_id *oid,
 
 struct ref *get_stale_heads(struct refspec *rs, struct ref *fetch_map)
 {
-	struct ref *ref, *stale_refs = NULL;
+	struct ref *stale_refs = NULL;
 	struct string_list ref_names = STRING_LIST_INIT_NODUP;
 	struct stale_heads_info info;
 
 	info.ref_names = &ref_names;
 	info.stale_refs_tail = &stale_refs;
 	info.rs = rs;
-	for (ref = fetch_map; ref; ref = ref->next)
+	for (struct ref *ref = fetch_map; ref; ref = ref->next)
 		string_list_append(&ref_names, ref->name);
 	string_list_sort(&ref_names);
 	for_each_ref(get_stale_heads_cb, &info);
@@ -2478,9 +2461,7 @@ struct ref *get_stale_heads(struct refspec *rs, struct ref *fetch_map)
  */
 static void clear_cas_option(struct push_cas_option *cas)
 {
-	int i;
-
-	for (i = 0; i < cas->nr; i++)
+	for (int i = 0; i < cas->nr; i++)
 		free(cas->entry[i].refname);
 	free(cas->entry);
 	memset(cas, 0, sizeof(*cas));
@@ -2645,7 +2626,6 @@ static int is_reachable_in_reflog(const char *local, const struct ref *remote)
 {
 	timestamp_t date;
 	struct commit *commit;
-	struct commit **chunk;
 	struct check_and_collect_until_cb_data cb;
 	struct reflog_commit_array arr = REFLOG_COMMIT_ARRAY_INIT;
 	size_t size = 0;
@@ -2674,7 +2654,7 @@ static int is_reachable_in_reflog(const char *local, const struct ref *remote)
 	 * Check if the remote commit is reachable from any
 	 * of the commits in the collected array, in batches.
 	 */
-	for (chunk = arr.item; chunk < arr.item + arr.nr; chunk += size) {
+	for (struct commit **chunk = arr.item; chunk < arr.item + arr.nr; chunk += size) {
 		size = arr.item + arr.nr - chunk;
 		if (MERGE_BASES_BATCH_SIZE < size)
 			size = MERGE_BASES_BATCH_SIZE;
@@ -2706,10 +2686,7 @@ static void apply_cas(struct push_cas_option *cas,
 		      struct remote *remote,
 		      struct ref *ref)
 {
-	int i;
-
-	/* Find an explicit --<option>=<name>[:<value>] entry */
-	for (i = 0; i < cas->nr; i++) {
+	for (int i = 0; i < cas->nr; i++) {
 		struct push_cas *entry = &cas->entry[i];
 		if (!refname_match(entry->refname, ref->name))
 			continue;
@@ -2742,8 +2719,7 @@ void apply_push_cas(struct push_cas_option *cas,
 		    struct remote *remote,
 		    struct ref *remote_refs)
 {
-	struct ref *ref;
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (struct ref *ref = remote_refs; ref; ref = ref->next) {
 		apply_cas(cas, remote, ref);
 
 		/*
@@ -2769,9 +2745,7 @@ struct remote_state *remote_state_new(void)
 
 void remote_state_clear(struct remote_state *remote_state)
 {
-	int i;
-
-	for (i = 0; i < remote_state->remotes_nr; i++)
+	for (int i = 0; i < remote_state->remotes_nr; i++)
 		remote_clear(remote_state->remotes[i]);
 	FREE_AND_NULL(remote_state->remotes);
 	remote_state->remotes_alloc = 0;
diff --git a/rerere.c b/rerere.c
index 13c94ded03..9819d76698 100644
--- a/rerere.c
+++ b/rerere.c
@@ -229,8 +229,7 @@ static struct lock_file write_lock;
 
 static int write_rr(struct string_list *rr, int out_fd)
 {
-	int i;
-	for (i = 0; i < rr->nr; i++) {
+	for (int i = 0; i < rr->nr; i++) {
 		struct strbuf buf = STRBUF_INIT;
 		struct rerere_id *id;
 
@@ -693,11 +692,10 @@ static int merge(struct index_state *istate, const struct rerere_id *id, const c
 static void update_paths(struct repository *r, struct string_list *update)
 {
 	struct lock_file index_lock = LOCK_INIT;
-	int i;
 
 	repo_hold_locked_index(r, &index_lock, LOCK_DIE_ON_ERROR);
 
-	for (i = 0; i < update->nr; i++) {
+	for (int i = 0; i < update->nr; i++) {
 		struct string_list_item *item = &update->items[i];
 		if (add_file_to_index(r->index, item->string, 0))
 			exit(128);
@@ -1097,7 +1095,7 @@ static int rerere_forget_one_path(struct index_state *istate,
 
 int rerere_forget(struct repository *r, struct pathspec *pathspec)
 {
-	int i, fd;
+	int fd;
 	struct string_list conflict = STRING_LIST_INIT_DUP;
 	struct string_list merge_rr = STRING_LIST_INIT_DUP;
 
@@ -1115,7 +1113,7 @@ int rerere_forget(struct repository *r, struct pathspec *pathspec)
 	 */
 	unmerge_index(r->index, pathspec, 0);
 	find_conflict(r, &conflict);
-	for (i = 0; i < conflict.nr; i++) {
+	for (int i = 0; i < conflict.nr; i++) {
 		struct string_list_item *it = &conflict.items[i];
 		if (!match_pathspec(r->index, pathspec, it->string,
 				    strlen(it->string), 0, NULL, 0))
@@ -1185,7 +1183,6 @@ void rerere_gc(struct repository *r, struct string_list *rr)
 	struct string_list to_remove = STRING_LIST_INIT_DUP;
 	DIR *dir;
 	struct dirent *e;
-	int i;
 	timestamp_t now = time(NULL);
 	timestamp_t cutoff_noresolve = now - 15 * 86400;
 	timestamp_t cutoff_resolve = now - 60 * 86400;
@@ -1224,7 +1221,7 @@ void rerere_gc(struct repository *r, struct string_list *rr)
 	closedir(dir);
 
 	/* ... and then remove the empty directories */
-	for (i = 0; i < to_remove.nr; i++)
+	for (int i = 0; i < to_remove.nr; i++)
 		rmdir(git_path("rr-cache/%s", to_remove.items[i].string));
 	string_list_clear(&to_remove, 0);
 	rollback_lock_file(&write_lock);
@@ -1239,12 +1236,10 @@ void rerere_gc(struct repository *r, struct string_list *rr)
  */
 void rerere_clear(struct repository *r, struct string_list *merge_rr)
 {
-	int i;
-
 	if (setup_rerere(r, merge_rr, 0) < 0)
 		return;
 
-	for (i = 0; i < merge_rr->nr; i++) {
+	for (int i = 0; i < merge_rr->nr; i++) {
 		struct rerere_id *id = merge_rr->items[i].util;
 		if (!has_rerere_resolution(id)) {
 			unlink_rr_item(id);
diff --git a/revision.c b/revision.c
index 2424c9bd67..5b1522cf3e 100644
--- a/revision.c
+++ b/revision.c
@@ -282,8 +282,6 @@ static void commit_stack_clear(struct commit_stack *stack)
 static void mark_one_parent_uninteresting(struct rev_info *revs, struct commit *commit,
 					  struct commit_stack *pending)
 {
-	struct commit_list *l;
-
 	if (commit->object.flags & UNINTERESTING)
 		return;
 	commit->object.flags |= UNINTERESTING;
@@ -296,7 +294,7 @@ static void mark_one_parent_uninteresting(struct rev_info *revs, struct commit *
 	 * wasn't uninteresting), in which case we need
 	 * to mark its parents recursively too..
 	 */
-	for (l = commit->parents; l; l = l->next) {
+	for (struct commit_list *l = commit->parents; l; l = l->next) {
 		commit_stack_push(pending, l->item);
 		if (revs && revs->exclude_first_parent_only)
 			break;
@@ -306,9 +304,7 @@ static void mark_one_parent_uninteresting(struct rev_info *revs, struct commit *
 void mark_parents_uninteresting(struct rev_info *revs, struct commit *commit)
 {
 	struct commit_stack pending = COMMIT_STACK_INIT;
-	struct commit_list *l;
-
-	for (l = commit->parents; l; l = l->next) {
+	for (struct commit_list *l = commit->parents; l; l = l->next) {
 		mark_one_parent_uninteresting(revs, l->item, &pending);
 		if (revs && revs->exclude_first_parent_only)
 			break;
@@ -756,7 +752,7 @@ static int check_maybe_different_in_bloom_filter(struct rev_info *revs,
 						 struct commit *commit)
 {
 	struct bloom_filter *filter;
-	int result = 1, j;
+	int result = 1;
 
 	if (!revs->repo->objects->commit_graph)
 		return -1;
@@ -771,7 +767,7 @@ static int check_maybe_different_in_bloom_filter(struct rev_info *revs,
 		return -1;
 	}
 
-	for (j = 0; result && j < revs->bloom_keys_nr; j++) {
+	for (int j = 0; result && j < revs->bloom_keys_nr; j++) {
 		result = bloom_filter_contains(filter,
 					       &revs->bloom_keys[j],
 					       revs->bloom_filter_settings);
@@ -1406,8 +1402,7 @@ static void limit_to_ancestry(struct commit_list *bottoms, struct commit_list *l
 static void collect_bottom_commits(struct commit_list *list,
 				   struct commit_list **bottom)
 {
-	struct commit_list *elem;
-	for (elem = list; elem; elem = elem->next)
+	for (struct commit_list *elem = list; elem; elem = elem->next)
 		if (elem->item->object.flags & BOTTOM)
 			commit_list_insert(elem->item, bottom);
 }
@@ -1415,9 +1410,7 @@ static void collect_bottom_commits(struct commit_list *list,
 /* Assumes either left_only or right_only is set */
 static void limit_left_right(struct commit_list *list, struct rev_info *revs)
 {
-	struct commit_list *p;
-
-	for (p = list; p; p = p->next) {
+	for (struct commit_list *p = list; p; p = p->next) {
 		struct commit *commit = p->item;
 
 		if (revs->right_only) {
@@ -1705,10 +1698,10 @@ static int handle_one_reflog(const char *refname_in_wt,
 
 static void add_other_reflogs_to_pending(struct all_refs_cb *cb)
 {
-	struct worktree **worktrees, **p;
+	struct worktree **worktrees;
 
 	worktrees = get_worktrees();
-	for (p = worktrees; *p; p++) {
+	for (struct worktree **p = worktrees; *p; p++) {
 		struct worktree *wt = *p;
 
 		if (wt->is_current)
@@ -1739,7 +1732,6 @@ static void add_cache_tree(struct cache_tree *it, struct rev_info *revs,
 			   struct strbuf *path, unsigned int flags)
 {
 	size_t baselen = path->len;
-	int i;
 
 	if (it->entry_count >= 0) {
 		struct tree *tree = lookup_tree(revs->repo, &it->oid);
@@ -1748,7 +1740,7 @@ static void add_cache_tree(struct cache_tree *it, struct rev_info *revs,
 					     040000, path->buf);
 	}
 
-	for (i = 0; i < it->subtree_nr; i++) {
+	for (int i = 0; i < it->subtree_nr; i++) {
 		struct cache_tree_sub *sub = it->down[i];
 		strbuf_addf(path, "%s%s", baselen ? "/" : "", sub->name);
 		add_cache_tree(sub->cache_tree, revs, path, flags);
@@ -1794,11 +1786,9 @@ static void do_add_index_objects_to_pending(struct rev_info *revs,
 					    struct index_state *istate,
 					    unsigned int flags)
 {
-	int i;
-
 	/* TODO: audit for interaction with sparse-index. */
 	ensure_full_index(istate);
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		struct blob *blob;
 
@@ -1824,7 +1814,7 @@ static void do_add_index_objects_to_pending(struct rev_info *revs,
 
 void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags)
 {
-	struct worktree **worktrees, **p;
+	struct worktree **worktrees;
 
 	repo_read_index(revs->repo);
 	do_add_index_objects_to_pending(revs, revs->repo->index, flags);
@@ -1833,7 +1823,7 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags)
 		return;
 
 	worktrees = get_worktrees();
-	for (p = worktrees; *p; p++) {
+	for (struct worktree **p = worktrees; *p; p++) {
 		struct worktree *wt = *p;
 		struct index_state istate = INDEX_STATE_INIT(revs->repo);
 
@@ -1967,7 +1957,7 @@ static void prepare_show_merge(struct rev_info *revs)
 	struct commit *head, *other;
 	struct object_id oid;
 	const char **prune = NULL;
-	int i, prune_num = 1; /* counting terminating NULL */
+	int prune_num = 1; /* counting terminating NULL */
 	struct index_state *istate = revs->repo->index;
 
 	if (repo_get_oid(the_repository, "HEAD", &oid))
@@ -1986,7 +1976,7 @@ static void prepare_show_merge(struct rev_info *revs)
 
 	if (!istate->cache_nr)
 		repo_read_index(revs->repo);
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		const struct cache_entry *ce = istate->cache[i];
 		if (!ce_stage(ce))
 			continue;
@@ -2962,7 +2952,6 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 
 
 		if (handle_revision_arg(arg, revs, flags, revarg_opt)) {
-			int j;
 			if (seen_dashdash || *arg == '^')
 				die("bad revision '%s'", arg);
 
@@ -2972,7 +2961,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 			 *     as a valid filename.
 			 * but the latter we have checked in the main loop.
 			 */
-			for (j = i; j < argc; j++)
+			for (int j = i; j < argc; j++)
 				verify_filename(revs->prefix, argv[j], j == i);
 
 			strvec_pushv(&prune_data, argv + i);
@@ -3095,9 +3084,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, struct s
 
 static void release_revisions_cmdline(struct rev_cmdline_info *cmdline)
 {
-	unsigned int i;
-
-	for (i = 0; i < cmdline->nr; i++)
+	for (unsigned int i = 0; i < cmdline->nr; i++)
 		free((char *)cmdline->rev[i].name);
 	free(cmdline->rev);
 }
@@ -3232,10 +3219,9 @@ static int mark_redundant_parents(struct commit *commit)
 
 static int mark_treesame_root_parents(struct commit *commit)
 {
-	struct commit_list *p;
 	int marked = 0;
 
-	for (p = commit->parents; p; p = p->next) {
+	for (struct commit_list *p = commit->parents; p; p = p->next) {
 		struct commit *parent = p->item;
 		if (!parent->parents && (parent->object.flags & TREESAME)) {
 			parent->object.flags |= TMP_MARK;
@@ -3499,8 +3485,7 @@ static void simplify_merges(struct rev_info *revs)
 
 static void set_children(struct rev_info *revs)
 {
-	struct commit_list *l;
-	for (l = revs->commits; l; l = l->next) {
+	for (struct commit_list *l = revs->commits; l; l = l->next) {
 		struct commit *commit = l->item;
 		struct commit_list *p;
 
@@ -3569,7 +3554,6 @@ static inline void test_flag_and_insert(struct prio_queue *q, struct commit *c,
 static void explore_walk_step(struct rev_info *revs)
 {
 	struct topo_walk_info *info = revs->topo_walk_info;
-	struct commit_list *p;
 	struct commit *c = prio_queue_get(&info->explore_queue);
 
 	if (!c)
@@ -3592,7 +3576,7 @@ static void explore_walk_step(struct rev_info *revs)
 	if (c->object.flags & UNINTERESTING)
 		mark_parents_uninteresting(revs, c);
 
-	for (p = c->parents; p; p = p->next)
+	for (struct commit_list *p = c->parents; p; p = p->next)
 		test_flag_and_insert(&info->explore_queue, p->item, TOPO_WALK_EXPLORED);
 }
 
@@ -3608,7 +3592,6 @@ static void explore_to_depth(struct rev_info *revs,
 
 static void indegree_walk_step(struct rev_info *revs)
 {
-	struct commit_list *p;
 	struct topo_walk_info *info = revs->topo_walk_info;
 	struct commit *c = prio_queue_get(&info->indegree_queue);
 
@@ -3622,7 +3605,7 @@ static void indegree_walk_step(struct rev_info *revs)
 
 	explore_to_depth(revs, commit_graph_generation(c));
 
-	for (p = c->parents; p; p = p->next) {
+	for (struct commit_list *p = c->parents; p; p = p->next) {
 		struct commit *parent = p->item;
 		int *pi = indegree_slab_at(&info->indegree, parent);
 
@@ -3760,7 +3743,6 @@ static struct commit *next_topo_commit(struct rev_info *revs)
 
 static void expand_topo_walk(struct rev_info *revs, struct commit *commit)
 {
-	struct commit_list *p;
 	struct topo_walk_info *info = revs->topo_walk_info;
 	if (process_parents(revs, commit, NULL, NULL) < 0) {
 		if (!revs->ignore_missing_links)
@@ -3770,7 +3752,7 @@ static void expand_topo_walk(struct rev_info *revs, struct commit *commit)
 
 	count_topo_walked++;
 
-	for (p = commit->parents; p; p = p->next) {
+	for (struct commit_list *p = commit->parents; p; p = p->next) {
 		struct commit *parent = p->item;
 		int *pi;
 		timestamp_t generation;
@@ -3800,7 +3782,6 @@ static void expand_topo_walk(struct rev_info *revs, struct commit *commit)
 
 int prepare_revision_walk(struct rev_info *revs)
 {
-	int i;
 	struct object_array old_pending;
 	struct commit_list **next = &revs->commits;
 
@@ -3808,7 +3789,7 @@ int prepare_revision_walk(struct rev_info *revs)
 	revs->pending.nr = 0;
 	revs->pending.alloc = 0;
 	revs->pending.objects = NULL;
-	for (i = 0; i < old_pending.nr; i++) {
+	for (int i = 0; i < old_pending.nr; i++) {
 		struct object_array_entry *e = old_pending.objects + i;
 		struct commit *commit = handle_commit(revs, e);
 		if (commit) {
@@ -4253,7 +4234,6 @@ static void gc_boundary(struct object_array *array)
 
 static void create_boundary_commit_list(struct rev_info *revs)
 {
-	unsigned i;
 	struct commit *c;
 	struct object_array *array = &revs->boundary_commits;
 	struct object_array_entry *objects = array->objects;
@@ -4271,7 +4251,7 @@ static void create_boundary_commit_list(struct rev_info *revs)
 	 * Put all of the actual boundary commits from revs->boundary_commits
 	 * into revs->commits
 	 */
-	for (i = 0; i < array->nr; i++) {
+	for (unsigned i = 0; i < array->nr; i++) {
 		c = (struct commit *)(objects[i].item);
 		if (!c)
 			continue;
@@ -4293,7 +4273,6 @@ static void create_boundary_commit_list(struct rev_info *revs)
 static struct commit *get_revision_internal(struct rev_info *revs)
 {
 	struct commit *c = NULL;
-	struct commit_list *l;
 
 	if (revs->boundary == 2) {
 		/*
@@ -4363,7 +4342,7 @@ static struct commit *get_revision_internal(struct rev_info *revs)
 	 * 'c', we need to mark its parents that they could be boundaries.
 	 */
 
-	for (l = c->parents; l; l = l->next) {
+	for (struct commit_list *l = c->parents; l; l = l->next) {
 		struct object *p;
 		p = &(l->item->object);
 		if (p->flags & (CHILD_SHOWN | SHOWN))
diff --git a/run-command.c b/run-command.c
index 0e7435718a..1834012723 100644
--- a/run-command.c
+++ b/run-command.c
@@ -107,9 +107,7 @@ static void mark_child_for_cleanup(pid_t pid, struct child_process *process)
 
 static void clear_child_for_cleanup(pid_t pid)
 {
-	struct child_to_clean **pp;
-
-	for (pp = &children_to_clean; *pp; pp = &(*pp)->next) {
+	for (struct child_to_clean **pp = &children_to_clean; *pp; pp = &(*pp)->next) {
 		struct child_to_clean *clean_me = *pp;
 
 		if (clean_me->pid == pid) {
@@ -445,7 +443,6 @@ static char **prep_childenv(const char *const *deltaenv)
 	struct string_list env = STRING_LIST_INIT_DUP;
 	struct strbuf key = STRBUF_INIT;
 	const char *const *p;
-	int i;
 
 	/* Construct a sorted string list consisting of the current environ */
 	for (p = (const char *const *) environ; p && *p; p++) {
@@ -478,7 +475,7 @@ static char **prep_childenv(const char *const *deltaenv)
 
 	/* Create an array of 'char *' to be used as the childenv */
 	ALLOC_ARRAY(childenv, env.nr + 1);
-	for (i = 0; i < env.nr; i++)
+	for (int i = 0; i < env.nr; i++)
 		childenv[i] = env.items[i].util;
 	childenv[env.nr] = NULL;
 
@@ -582,12 +579,11 @@ static int wait_or_whine(pid_t pid, const char *argv0, int in_signal)
 static void trace_add_env(struct strbuf *dst, const char *const *deltaenv)
 {
 	struct string_list envs = STRING_LIST_INIT_DUP;
-	const char *const *e;
 	int i;
 	int printed_unset = 0;
 
 	/* Last one wins, see run-command.c:prep_childenv() for context */
-	for (e = deltaenv; e && *e; e++) {
+	for (const char * const *e = deltaenv; e && *e; e++) {
 		struct strbuf key = STRBUF_INIT;
 		char *equals = strchr(*e, '=');
 
@@ -769,7 +765,6 @@ int start_command(struct child_process *cmd)
 	cmd->pid = fork();
 	failed_errno = errno;
 	if (!cmd->pid) {
-		int sig;
 		/*
 		 * Ensure the default die/error/warn routines do not get
 		 * called, they can take stdio locks and malloc.
@@ -821,7 +816,7 @@ int start_command(struct child_process *cmd)
 		 * restore default signal handlers here, in case
 		 * we catch a signal right before execve below
 		 */
-		for (sig = 1; sig < NSIG; sig++) {
+		for (int sig = 1; sig < NSIG; sig++) {
 			/* ignored signals get reset to SIG_DFL on execve */
 			if (signal(sig, SIG_DFL) == SIG_IGN)
 				signal(sig, SIG_IGN);
@@ -1077,9 +1072,7 @@ static int git_atexit_installed;
 
 static void git_atexit_dispatch(void)
 {
-	size_t i;
-
-	for (i=git_atexit_hdlrs.nr ; i ; i--)
+	for (size_t i = git_atexit_hdlrs.nr; i; i--)
 		git_atexit_hdlrs.handlers[i-1]();
 }
 
@@ -1812,9 +1805,7 @@ int run_auto_maintenance(int quiet)
 
 void prepare_other_repo_env(struct strvec *env, const char *new_git_dir)
 {
-	const char * const *var;
-
-	for (var = local_repo_env; *var; var++) {
+	for (const char * const *var = local_repo_env; *var; var++) {
 		if (strcmp(*var, CONFIG_DATA_ENVIRONMENT) &&
 		    strcmp(*var, CONFIG_COUNT_ENVIRONMENT))
 			strvec_push(env, *var);
diff --git a/scalar.c b/scalar.c
index fb2940c2a0..c2b7ec58ef 100644
--- a/scalar.c
+++ b/scalar.c
@@ -169,10 +169,9 @@ static int set_recommended_config(int reconfigure)
 		{ "fetch.showForcedUpdates", "false" },
 		{ NULL, NULL },
 	};
-	int i;
 	char *value;
 
-	for (i = 0; config[i].key; i++) {
+	for (int i = 0; config[i].key; i++) {
 		if (set_scalar_config(config + i, reconfigure))
 			return error(_("could not configure %s=%s"),
 				     config[i].key, config[i].value);
@@ -644,7 +643,7 @@ static int cmd_reconfigure(int argc, const char **argv)
 		NULL
 	};
 	struct string_list scalar_repos = STRING_LIST_INIT_DUP;
-	int i, res = 0;
+	int res = 0;
 	struct repository r = { NULL };
 	struct strbuf commondir = STRBUF_INIT, gitdir = STRBUF_INIT;
 
@@ -663,7 +662,7 @@ static int cmd_reconfigure(int argc, const char **argv)
 
 	git_config(get_scalar_repos, &scalar_repos);
 
-	for (i = 0; i < scalar_repos.nr; i++) {
+	for (int i = 0; i < scalar_repos.nr; i++) {
 		int succeeded = 0;
 		const char *dir = scalar_repos.items[i].string;
 
diff --git a/send-pack.c b/send-pack.c
index 37f59d4f66..f743fe84b5 100644
--- a/send-pack.c
+++ b/send-pack.c
@@ -344,10 +344,9 @@ static int generate_push_cert(struct strbuf *req_buf,
 			      const char *cap_string,
 			      const char *push_cert_nonce)
 {
-	const struct ref *ref;
 	struct string_list_item *item;
 	char *signing_key_id = xstrdup(get_signing_key_id());
-	const char *cp, *np;
+	const char *np;
 	struct strbuf cert = STRBUF_INIT;
 	int update_seen = 0;
 
@@ -367,7 +366,7 @@ static int generate_push_cert(struct strbuf *req_buf,
 			strbuf_addf(&cert, "push-option %s\n", item->string);
 	strbuf_addstr(&cert, "\n");
 
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (const struct ref *ref = remote_refs; ref; ref = ref->next) {
 		if (check_to_send_update(ref, args) < 0)
 			continue;
 		update_seen = 1;
@@ -383,7 +382,7 @@ static int generate_push_cert(struct strbuf *req_buf,
 		die(_("failed to sign the push certificate"));
 
 	packet_buf_write(req_buf, "push-cert%c%s", 0, cap_string);
-	for (cp = cert.buf; cp < cert.buf + cert.len; cp = np) {
+	for (const char *cp = cert.buf; cp < cert.buf + cert.len; cp = np) {
 		np = next_line(cp, cert.buf + cert.len - cp);
 		packet_buf_write(req_buf,
 				 "%.*s", (int)(np - cp), cp);
@@ -423,14 +422,13 @@ static void get_commons_through_negotiation(const char *url,
 					    struct oid_array *commons)
 {
 	struct child_process child = CHILD_PROCESS_INIT;
-	const struct ref *ref;
 	int len = the_hash_algo->hexsz + 1; /* hash + NL */
 
 	child.git_cmd = 1;
 	child.no_stdin = 1;
 	child.out = -1;
 	strvec_pushl(&child.args, "fetch", "--negotiate-only", NULL);
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (const struct ref *ref = remote_refs; ref; ref = ref->next) {
 		if (!is_null_oid(&ref->new_oid))
 			strvec_pushf(&child.args, "--negotiation-tip=%s", oid_to_hex(&ref->new_oid));
 	}
diff --git a/sequencer.c b/sequencer.c
index f49a871ac0..5f5c92c3a2 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -321,7 +321,6 @@ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
 {
 	struct process_trailer_options opts = PROCESS_TRAILER_OPTIONS_INIT;
 	struct trailer_info info;
-	size_t i;
 	int found_sob = 0, found_sob_last = 0;
 	char saved_char;
 
@@ -340,7 +339,7 @@ static int has_conforming_footer(struct strbuf *sb, struct strbuf *sob,
 	if (info.trailer_block_start == info.trailer_block_end)
 		return 0;
 
-	for (i = 0; i < info.trailer_nr; i++)
+	for (size_t i = 0; i < info.trailer_nr; i++)
 		if (sob && !strncmp(info.trailers[i], sob->buf, sob->len)) {
 			found_sob = 1;
 			if (i == info.trailer_nr - 1)
@@ -690,7 +689,6 @@ static int do_recursive_merge(struct repository *r,
 	struct merge_result result;
 	struct tree *next_tree, *base_tree, *head_tree;
 	int clean, show_output;
-	int i;
 	struct lock_file index_lock = LOCK_INIT;
 
 	if (repo_hold_locked_index(r, &index_lock, LOCK_REPORT_ON_ERROR) < 0)
@@ -710,7 +708,7 @@ static int do_recursive_merge(struct repository *r,
 	next_tree = next ? repo_get_commit_tree(r, next) : empty_tree(r);
 	base_tree = base ? repo_get_commit_tree(r, base) : empty_tree(r);
 
-	for (i = 0; i < opts->xopts.nr; i++)
+	for (int i = 0; i < opts->xopts.nr; i++)
 		parse_merge_opt(&o, opts->xopts.v[i]);
 
 	if (!opts->strategy || !strcmp(opts->strategy, "ort")) {
@@ -895,7 +893,7 @@ int read_author_script(const char *path, char **name, char **email, char **date,
 	struct strbuf buf = STRBUF_INIT;
 	struct string_list kv = STRING_LIST_INIT_DUP;
 	int retval = -1; /* assume failure */
-	int i, name_i = -2, email_i = -2, date_i = -2, err = 0;
+	int name_i = -2, email_i = -2, date_i = -2, err = 0;
 
 	if (strbuf_read_file(&buf, path, 256) <= 0) {
 		strbuf_release(&buf);
@@ -909,7 +907,7 @@ int read_author_script(const char *path, char **name, char **email, char **date,
 	if (parse_key_value_squoted(buf.buf, &kv))
 		goto finish;
 
-	for (i = 0; i < kv.nr; i++) {
+	for (int i = 0; i < kv.nr; i++) {
 		if (!strcmp(kv.items[i].string, "GIT_AUTHOR_NAME")) {
 			if (name_i != -2)
 				name_i = error(_("'GIT_AUTHOR_NAME' already given"));
@@ -985,10 +983,9 @@ static char *get_author(const char *message)
 
 static const char *author_date_from_env(const struct strvec *env)
 {
-	int i;
 	const char *date;
 
-	for (i = 0; i < env->nr; i++)
+	for (int i = 0; i < env->nr; i++)
 		if (skip_prefix(env->v[i],
 				"GIT_AUTHOR_DATE=", &date))
 			return date;
@@ -1120,11 +1117,11 @@ static int run_git_commit(const char *defmsg,
 
 static int rest_is_empty(const struct strbuf *sb, int start)
 {
-	int i, eol;
+	int eol;
 	const char *nl;
 
 	/* Check if the rest is just whitespace and Signed-off-by's. */
-	for (i = start; i < sb->len; i++) {
+	for (int i = start; i < sb->len; i++) {
 		nl = memchr(sb->buf + i, '\n', sb->len - i);
 		if (nl)
 			eol = nl - sb->buf;
@@ -2690,11 +2687,11 @@ int todo_list_parse_insn_buffer(struct repository *r, char *buf,
 {
 	struct todo_item *item;
 	char *p = buf, *next_p;
-	int i, res = 0, fixup_okay = file_exists(rebase_path_done());
+	int res = 0, fixup_okay = file_exists(rebase_path_done());
 
 	todo_list->current = todo_list->nr = todo_list->total_nr = 0;
 
-	for (i = 1; *p; i++, p = next_p) {
+	for (int i = 1; *p; i++, p = next_p) {
 		char *eol = strchrnul(p, '\n');
 
 		next_p = *eol ? eol + 1 /* skip LF */ : eol;
@@ -2730,9 +2727,9 @@ int todo_list_parse_insn_buffer(struct repository *r, char *buf,
 
 static int count_commands(struct todo_list *todo_list)
 {
-	int count = 0, i;
+	int count = 0;
 
-	for (i = 0; i < todo_list->nr; i++)
+	for (int i = 0; i < todo_list->nr; i++)
 		if (todo_list->items[i].command != TODO_COMMENT)
 			count++;
 
@@ -2867,9 +2864,7 @@ static int read_populate_todo(struct repository *r,
 	if (!is_rebase_i(opts)) {
 		enum todo_command valid =
 			opts->action == REPLAY_PICK ? TODO_PICK : TODO_REVERT;
-		int i;
-
-		for (i = 0; i < todo_list->nr; i++)
+		for (int i = 0; i < todo_list->nr; i++)
 			if (valid == todo_list->items[i].command)
 				continue;
 			else if (valid == TODO_PICK)
@@ -2961,7 +2956,6 @@ static int populate_opts_cb(const char *key, const char *value,
 
 static void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
 {
-	int i;
 	int count;
 	const char **argv;
 	char *strategy_opts_string = raw_opts;
@@ -2973,7 +2967,7 @@ static void parse_strategy_opts(struct replay_opts *opts, char *raw_opts)
 	if (count < 0)
 		BUG("could not split '%s': %s", strategy_opts_string,
 			    split_cmdline_strerror(count));
-	for (i = 0; i < count; i++) {
+	for (int i = 0; i < count; i++) {
 		const char *arg = argv[i];
 
 		skip_prefix(arg, "--", &arg);
@@ -4455,9 +4449,7 @@ static int is_final_fixup(struct todo_list *todo_list)
 
 static enum todo_command peek_command(struct todo_list *todo_list, int offset)
 {
-	int i;
-
-	for (i = todo_list->current + offset; i < todo_list->nr; i++)
+	for (int i = todo_list->current + offset; i < todo_list->nr; i++)
 		if (!is_noop(todo_list->items[i].command))
 			return todo_list->items[i].command;
 
@@ -5283,13 +5275,13 @@ int sequencer_pick_revisions(struct repository *r,
 {
 	struct todo_list todo_list = TODO_LIST_INIT;
 	struct object_id oid;
-	int i, res;
+	int res;
 
 	assert(opts->revs);
 	if (read_and_refresh_cache(r, opts))
 		return -1;
 
-	for (i = 0; i < opts->revs->pending.nr; i++) {
+	for (int i = 0; i < opts->revs->pending.nr; i++) {
 		struct object_id oid;
 		const char *name = opts->revs->pending.objects[i].name;
 
diff --git a/serve.c b/serve.c
index a1d71134d4..7cd8f410a6 100644
--- a/serve.c
+++ b/serve.c
@@ -149,12 +149,11 @@ void protocol_v2_advertise_capabilities(void)
 {
 	struct strbuf capability = STRBUF_INIT;
 	struct strbuf value = STRBUF_INIT;
-	int i;
 
 	/* serve by default supports v2 */
 	packet_write_fmt(1, "version 2\n");
 
-	for (i = 0; i < ARRAY_SIZE(capabilities); i++) {
+	for (int i = 0; i < ARRAY_SIZE(capabilities); i++) {
 		struct protocol_capability *c = &capabilities[i];
 
 		if (c->advertise(the_repository, &value)) {
@@ -180,12 +179,10 @@ void protocol_v2_advertise_capabilities(void)
 
 static struct protocol_capability *get_capability(const char *key, const char **value)
 {
-	int i;
-
 	if (!key)
 		return NULL;
 
-	for (i = 0; i < ARRAY_SIZE(capabilities); i++) {
+	for (int i = 0; i < ARRAY_SIZE(capabilities); i++) {
 		struct protocol_capability *c = &capabilities[i];
 		const char *out;
 		if (!skip_prefix(key, c->name, &out))
diff --git a/server-info.c b/server-info.c
index e2fe0f9143..2ea99f0db9 100644
--- a/server-info.c
+++ b/server-info.c
@@ -196,8 +196,7 @@ static int num_pack;
 
 static struct pack_info *find_pack_by_name(const char *name)
 {
-	int i;
-	for (i = 0; i < num_pack; i++) {
+	for (int i = 0; i < num_pack; i++) {
 		struct packed_git *p = info[i]->p;
 		if (!strcmp(pack_basename(p), name))
 			return info[i];
@@ -289,12 +288,11 @@ static int compare_info(const void *a_, const void *b_)
 
 static void init_pack_info(const char *infofile, int force)
 {
-	struct packed_git *p;
 	int stale;
 	int i;
 	size_t alloc = 0;
 
-	for (p = get_all_packs(the_repository); p; p = p->next) {
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next) {
 		/* we ignore things on alternate path since they are
 		 * not available to the pullers in general.
 		 */
@@ -325,16 +323,14 @@ static void init_pack_info(const char *infofile, int force)
 
 static void free_pack_info(void)
 {
-	int i;
-	for (i = 0; i < num_pack; i++)
+	for (int i = 0; i < num_pack; i++)
 		free(info[i]);
 	free(info);
 }
 
 static int write_pack_info_file(struct update_info_ctx *uic)
 {
-	int i;
-	for (i = 0; i < num_pack; i++) {
+	for (int i = 0; i < num_pack; i++) {
 		if (uic_printf(uic, "P %s\n", pack_basename(info[i]->p)) < 0)
 			return -1;
 	}
diff --git a/setup.c b/setup.c
index b69b1cbc2a..d732ae072c 100644
--- a/setup.c
+++ b/setup.c
@@ -224,7 +224,6 @@ static void NORETURN die_verify_filename(struct repository *r,
  */
 static int looks_like_pathspec(const char *arg)
 {
-	const char *p;
 	int escaped = 0;
 
 	/*
@@ -234,7 +233,7 @@ static int looks_like_pathspec(const char *arg)
 	 * cause any increase in the match. Likewise ignore backslash-escaped
 	 * wildcard characters.
 	 */
-	for (p = arg; *p; p++) {
+	for (const char *p = arg; *p; p++) {
 		if (escaped) {
 			escaped = 0;
 		} else if (is_glob_special(*p)) {
@@ -775,27 +774,23 @@ int verify_repository_format(const struct repository_format *format,
 	}
 
 	if (format->version >= 1 && format->unknown_extensions.nr) {
-		int i;
-
 		strbuf_addstr(err, Q_("unknown repository extension found:",
 				      "unknown repository extensions found:",
 				      format->unknown_extensions.nr));
 
-		for (i = 0; i < format->unknown_extensions.nr; i++)
+		for (int i = 0; i < format->unknown_extensions.nr; i++)
 			strbuf_addf(err, "\n\t%s",
 				    format->unknown_extensions.items[i].string);
 		return -1;
 	}
 
 	if (format->version == 0 && format->v1_only_extensions.nr) {
-		int i;
-
 		strbuf_addstr(err,
 			      Q_("repo version is 0, but v1-only extension found:",
 				 "repo version is 0, but v1-only extensions found:",
 				 format->v1_only_extensions.nr));
 
-		for (i = 0; i < format->v1_only_extensions.nr; i++)
+		for (int i = 0; i < format->v1_only_extensions.nr; i++)
 			strbuf_addf(err, "\n\t%s",
 				    format->v1_only_extensions.items[i].string);
 		return -1;
diff --git a/shallow.c b/shallow.c
index 7711798127..fd3860ec84 100644
--- a/shallow.c
+++ b/shallow.c
@@ -332,7 +332,6 @@ static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol,
 				   unsigned flags)
 {
 	struct write_shallow_data data;
-	int i;
 	data.out = out;
 	data.use_pack_protocol = use_pack_protocol;
 	data.count = 0;
@@ -340,7 +339,7 @@ static int write_shallow_commits_1(struct strbuf *out, int use_pack_protocol,
 	for_each_commit_graft(write_one_shallow, &data);
 	if (!extra)
 		return data.count;
-	for (i = 0; i < extra->nr; i++) {
+	for (int i = 0; i < extra->nr; i++) {
 		strbuf_addstr(out, oid_to_hex(extra->oid + i));
 		strbuf_addch(out, '\n');
 		data.count++;
@@ -462,7 +461,6 @@ struct trace_key trace_shallow = TRACE_KEY_INIT(SHALLOW);
  */
 void prepare_shallow_info(struct shallow_info *info, struct oid_array *sa)
 {
-	int i;
 	trace_printf_key(&trace_shallow, "shallow: prepare_shallow_info\n");
 	memset(info, 0, sizeof(*info));
 	info->shallow = sa;
@@ -470,7 +468,7 @@ void prepare_shallow_info(struct shallow_info *info, struct oid_array *sa)
 		return;
 	ALLOC_ARRAY(info->ours, sa->nr);
 	ALLOC_ARRAY(info->theirs, sa->nr);
-	for (i = 0; i < sa->nr; i++) {
+	for (int i = 0; i < sa->nr; i++) {
 		if (repo_has_object_file(the_repository, sa->oid + i)) {
 			struct commit_graft *graft;
 			graft = lookup_commit_graft(the_repository,
@@ -494,9 +492,9 @@ void clear_shallow_info(struct shallow_info *info)
 void remove_nonexistent_theirs_shallow(struct shallow_info *info)
 {
 	struct object_id *oid = info->shallow->oid;
-	int i, dst;
+	int dst;
 	trace_printf_key(&trace_shallow, "shallow: remove_nonexistent_theirs_shallow\n");
-	for (i = dst = 0; i < info->nr_theirs; i++) {
+	for (int i = dst = 0; i < info->nr_theirs; i++) {
 		if (i != dst)
 			info->theirs[dst] = info->theirs[i];
 		if (repo_has_object_file(the_repository, oid + info->theirs[i]))
@@ -738,10 +736,9 @@ static int add_ref(const char *refname UNUSED,
 
 static void update_refstatus(int *ref_status, int nr, uint32_t *bitmap)
 {
-	unsigned int i;
 	if (!ref_status)
 		return;
-	for (i = 0; i < nr; i++)
+	for (unsigned int i = 0; i < nr; i++)
 		if (bitmap[i / 32] & (1U << (i % 32)))
 			ref_status[i]++;
 }
diff --git a/shell.c b/shell.c
index 2ece8b16e2..12ad887390 100644
--- a/shell.c
+++ b/shell.c
@@ -161,7 +161,6 @@ int cmd_main(int argc, const char **argv)
 {
 	char *prog;
 	const char **user_argv;
-	struct commands *cmd;
 	int count;
 
 	/*
@@ -193,7 +192,7 @@ int cmd_main(int argc, const char **argv)
 		/* Accept "git foo" as if the caller said "git-foo". */
 		prog[3] = '-';
 
-	for (cmd = cmd_list ; cmd->name ; cmd++) {
+	for (struct commands *cmd = cmd_list; cmd->name; cmd++) {
 		int len = strlen(cmd->name);
 		char *arg;
 		if (strncmp(cmd->name, prog, len))
diff --git a/sideband.c b/sideband.c
index 266a67342b..ffd5d508ee 100644
--- a/sideband.c
+++ b/sideband.c
@@ -31,7 +31,6 @@ static int use_sideband_colors(void)
 	const char *key = "color.remote";
 	struct strbuf sb = STRBUF_INIT;
 	char *value;
-	int i;
 
 	if (use_sideband_colors_cached >= 0)
 		return use_sideband_colors_cached;
@@ -44,7 +43,7 @@ static int use_sideband_colors(void)
 		use_sideband_colors_cached = GIT_COLOR_AUTO;
 	}
 
-	for (i = 0; i < ARRAY_SIZE(keywords); i++) {
+	for (int i = 0; i < ARRAY_SIZE(keywords); i++) {
 		strbuf_reset(&sb);
 		strbuf_addf(&sb, "%s.%s", key, keywords[i].keyword);
 		if (git_config_get_string(sb.buf, &value))
@@ -58,9 +57,7 @@ static int use_sideband_colors(void)
 
 void list_config_color_sideband_slots(struct string_list *list, const char *prefix)
 {
-	int i;
-
-	for (i = 0; i < ARRAY_SIZE(keywords); i++)
+	for (int i = 0; i < ARRAY_SIZE(keywords); i++)
 		list_config_item(list, prefix, keywords[i].keyword);
 }
 
@@ -76,8 +73,6 @@ void list_config_color_sideband_slots(struct string_list *list, const char *pref
  */
 static void maybe_colorize_sideband(struct strbuf *dest, const char *src, int n)
 {
-	int i;
-
 	if (!want_color_stderr(use_sideband_colors())) {
 		strbuf_add(dest, src, n);
 		return;
@@ -89,7 +84,7 @@ static void maybe_colorize_sideband(struct strbuf *dest, const char *src, int n)
 		n--;
 	}
 
-	for (i = 0; i < ARRAY_SIZE(keywords); i++) {
+	for (int i = 0; i < ARRAY_SIZE(keywords); i++) {
 		struct keyword_entry *p = keywords + i;
 		int len = strlen(p->keyword);
 
diff --git a/sparse-index.c b/sparse-index.c
index e48e40cae7..5017264a18 100644
--- a/sparse-index.c
+++ b/sparse-index.c
@@ -118,8 +118,7 @@ int set_sparse_index_config(struct repository *repo, int enable)
 
 static int index_has_unmerged_entries(struct index_state *istate)
 {
-	int i;
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		if (ce_stage(istate->cache[i]))
 			return 1;
 	}
@@ -290,7 +289,6 @@ static int add_path_to_index(const struct object_id *oid,
 
 void expand_index(struct index_state *istate, struct pattern_list *pl)
 {
-	int i;
 	struct index_state *full;
 	struct strbuf base = STRBUF_INIT;
 	const char *tr_region;
@@ -356,7 +354,7 @@ void expand_index(struct index_state *istate, struct pattern_list *pl)
 	ctx.write = full;
 	ctx.pl = pl;
 
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		struct tree *tree;
 		struct pathspec ps;
@@ -491,8 +489,6 @@ void clear_skip_worktree_from_present_files(struct index_state *istate)
 	const char *last_dirname = NULL;
 	size_t dir_len = 0;
 	int dir_found = 1;
-
-	int i;
 	int path_count[2] = {0, 0};
 	int restarted = 0;
 
@@ -503,7 +499,7 @@ void clear_skip_worktree_from_present_files(struct index_state *istate)
 	trace2_region_enter("index", "clear_skip_worktree_from_present_files",
 			    istate->repo);
 restart:
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 
 		if (ce_skip_worktree(ce)) {
diff --git a/split-index.c b/split-index.c
index 8c38687c04..2c33e8fcf6 100644
--- a/split-index.c
+++ b/split-index.c
@@ -63,22 +63,13 @@ int write_link_extension(struct strbuf *sb,
 
 static void mark_base_index_entries(struct index_state *base)
 {
-	int i;
-	/*
-	 * To keep track of the shared entries between
-	 * istate->base->cache[] and istate->cache[], base entry
-	 * position is stored in each base entry. All positions start
-	 * from 1 instead of 0, which is reserved to say "this is a new
-	 * entry".
-	 */
-	for (i = 0; i < base->cache_nr; i++)
+	for (int i = 0; i < base->cache_nr; i++)
 		base->cache[i]->index = i + 1;
 }
 
 void move_cache_to_base_index(struct index_state *istate)
 {
 	struct split_index *si = istate->split_index;
-	int i;
 
 	/*
 	 * If there was a previous base index, then transfer ownership of allocated
@@ -111,7 +102,7 @@ void move_cache_to_base_index(struct index_state *istate)
 
 	COPY_ARRAY(si->base->cache, istate->cache, istate->cache_nr);
 	mark_base_index_entries(si->base);
-	for (i = 0; i < si->base->cache_nr; i++)
+	for (int i = 0; i < si->base->cache_nr; i++)
 		si->base->cache[i]->ce_flags &= ~CE_UPDATE_IN_BASE;
 }
 
@@ -156,7 +147,6 @@ static void replace_entry(size_t pos, void *data)
 void merge_base_index(struct index_state *istate)
 {
 	struct split_index *si = istate->split_index;
-	unsigned int i;
 
 	mark_base_index_entries(si->base);
 
@@ -175,7 +165,7 @@ void merge_base_index(struct index_state *istate)
 	if (si->nr_deletions)
 		remove_marked_cache_entries(istate, 0);
 
-	for (i = si->nr_replacements; i < si->saved_cache_nr; i++) {
+	for (unsigned int i = si->nr_replacements; i < si->saved_cache_nr; i++) {
 		if (!ce_namelen(si->saved_cache[i]))
 			die("corrupt link extension, entry %d should "
 			    "have non-zero length name", i);
diff --git a/strbuf.c b/strbuf.c
index 7827178d8e..9463f54e4e 100644
--- a/strbuf.c
+++ b/strbuf.c
@@ -444,9 +444,9 @@ size_t strbuf_expand_literal(struct strbuf *sb, const char *placeholder)
 
 void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src)
 {
-	size_t i, len = src->len;
+	size_t len = src->len;
 
-	for (i = 0; i < len; i++) {
+	for (size_t i = 0; i < len; i++) {
 		if (src->buf[i] == '%')
 			strbuf_addch(dst, '%');
 		strbuf_addch(dst, src->buf[i]);
@@ -457,9 +457,9 @@ void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src)
 
 void strbuf_add_percentencode(struct strbuf *dst, const char *src, int flags)
 {
-	size_t i, len = strlen(src);
+	size_t len = strlen(src);
 
-	for (i = 0; i < len; i++) {
+	for (size_t i = 0; i < len; i++) {
 		unsigned char ch = src[i];
 		if (ch <= 0x1F || ch >= 0x7F ||
 		    (ch == '/' && (flags & STRBUF_ENCODE_SLASH)) ||
@@ -876,11 +876,11 @@ int fprintf_ln(FILE *fp, const char *fmt, ...)
 char *xstrdup_tolower(const char *string)
 {
 	char *result;
-	size_t len, i;
+	size_t len;
 
 	len = strlen(string);
 	result = xmallocz(len);
-	for (i = 0; i < len; i++)
+	for (size_t i = 0; i < len; i++)
 		result[i] = tolower(string[i]);
 	return result;
 }
@@ -888,11 +888,11 @@ char *xstrdup_tolower(const char *string)
 char *xstrdup_toupper(const char *string)
 {
 	char *result;
-	size_t len, i;
+	size_t len;
 
 	len = strlen(string);
 	result = xmallocz(len);
-	for (i = 0; i < len; i++)
+	for (size_t i = 0; i < len; i++)
 		result[i] = toupper(string[i]);
 	return result;
 }
@@ -1011,13 +1011,13 @@ static size_t cleanup(char *line, size_t len)
 void strbuf_stripspace(struct strbuf *sb, char comment_line_char)
 {
 	size_t empties = 0;
-	size_t i, j, len, newlen;
+	size_t j, len, newlen;
 	char *eol;
 
 	/* We may have to add a newline. */
 	strbuf_grow(sb, 1);
 
-	for (i = j = 0; i < sb->len; i += len, j += newlen) {
+	for (size_t i = j = 0; i < sb->len; i += len, j += newlen) {
 		eol = memchr(sb->buf + i, '\n', sb->len - i);
 		len = eol ? eol - (sb->buf + i) + 1 : sb->len - i;
 
diff --git a/string-list.c b/string-list.c
index 954569f381..8a2c020e81 100644
--- a/string-list.c
+++ b/string-list.c
@@ -114,9 +114,9 @@ struct string_list_item *string_list_lookup(struct string_list *list, const char
 void string_list_remove_duplicates(struct string_list *list, int free_util)
 {
 	if (list->nr > 1) {
-		int src, dst;
+		int dst;
 		compare_strings_fn cmp = list->cmp ? list->cmp : strcmp;
-		for (src = dst = 1; src < list->nr; src++) {
+		for (int src = dst = 1; src < list->nr; src++) {
 			if (!cmp(list->items[dst - 1].string, list->items[src].string)) {
 				if (list->strdup_strings)
 					free(list->items[src].string);
@@ -132,8 +132,8 @@ void string_list_remove_duplicates(struct string_list *list, int free_util)
 int for_each_string_list(struct string_list *list,
 			 string_list_each_func_t fn, void *cb_data)
 {
-	int i, ret = 0;
-	for (i = 0; i < list->nr; i++)
+	int ret = 0;
+	for (int i = 0; i < list->nr; i++)
 		if ((ret = fn(&list->items[i], cb_data)))
 			break;
 	return ret;
@@ -142,8 +142,8 @@ int for_each_string_list(struct string_list *list,
 void filter_string_list(struct string_list *list, int free_util,
 			string_list_each_func_t want, void *cb_data)
 {
-	int src, dst = 0;
-	for (src = 0; src < list->nr; src++) {
+	int dst = 0;
+	for (int src = 0; src < list->nr; src++) {
 		if (want(&list->items[src], cb_data)) {
 			list->items[dst++] = list->items[src];
 		} else {
diff --git a/strvec.c b/strvec.c
index 178f4f3748..44daaa4243 100644
--- a/strvec.c
+++ b/strvec.c
@@ -88,8 +88,7 @@ void strvec_split(struct strvec *array, const char *to_split)
 void strvec_clear(struct strvec *array)
 {
 	if (array->v != empty_strvec) {
-		int i;
-		for (i = 0; i < array->nr; i++)
+		for (int i = 0; i < array->nr; i++)
 			free((char *)array->v[i]);
 		free(array->v);
 	}
diff --git a/submodule.c b/submodule.c
index 213da79f66..1151d98f01 100644
--- a/submodule.c
+++ b/submodule.c
@@ -181,10 +181,9 @@ void add_submodule_odb_by_path(const char *path)
 
 int register_all_submodule_odb_as_alternates(void)
 {
-	int i;
 	int ret = added_submodule_odb_paths.nr;
 
-	for (i = 0; i < added_submodule_odb_paths.nr; i++)
+	for (int i = 0; i < added_submodule_odb_paths.nr; i++)
 		add_to_alternates_memory(added_submodule_odb_paths.items[i].string);
 	if (ret) {
 		string_list_clear(&added_submodule_odb_paths, 0);
@@ -329,14 +328,14 @@ int is_submodule_populated_gently(const char *path, int *return_error_code)
 void die_in_unpopulated_submodule(struct index_state *istate,
 				  const char *prefix)
 {
-	int i, prefixlen;
+	int prefixlen;
 
 	if (!prefix)
 		return;
 
 	prefixlen = strlen(prefix);
 
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		int ce_len = ce_namelen(ce);
 
@@ -359,9 +358,9 @@ void die_in_unpopulated_submodule(struct index_state *istate,
 void die_path_inside_submodule(struct index_state *istate,
 			       const struct pathspec *ps)
 {
-	int i, j;
+	int j;
 
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 		int ce_len = ce_namelen(ce);
 
@@ -467,8 +466,6 @@ static int prepare_submodule_diff_summary(struct repository *r, struct rev_info
 					  struct commit *left, struct commit *right,
 					  struct commit_list *merge_bases)
 {
-	struct commit_list *list;
-
 	repo_init_revisions(r, rev, NULL);
 	setup_revisions(0, NULL, rev, NULL);
 	rev->left_right = 1;
@@ -476,7 +473,7 @@ static int prepare_submodule_diff_summary(struct repository *r, struct rev_info
 	left->object.flags |= SYMMETRIC_LEFT;
 	add_pending_object(rev, &left->object, path);
 	add_pending_object(rev, &right->object, path);
-	for (list = merge_bases; list; list = list->next) {
+	for (struct commit_list *list = merge_bases; list; list = list->next) {
 		list->item->object.flags |= UNINTERESTING;
 		add_pending_object(rev, &list->item->object,
 			oid_to_hex(&list->item->object.oid));
@@ -843,9 +840,7 @@ static void collect_changed_submodules_cb(struct diff_queue_struct *q,
 	struct collect_changed_submodules_cb_data *me = data;
 	struct string_list *changed = me->changed;
 	const struct object_id *commit_oid = me->commit_oid;
-	int i;
-
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p = q->queue[i];
 		const struct submodule *submodule;
 		const char *name;
@@ -1152,9 +1147,8 @@ static int push_submodule(const char *path,
 		}
 
 		if (remote->origin != REMOTE_UNCONFIGURED) {
-			int i;
 			strvec_push(&cp.args, remote->name);
-			for (i = 0; i < rs->raw_nr; i++)
+			for (int i = 0; i < rs->raw_nr; i++)
 				strvec_push(&cp.args, rs->raw[i]);
 		}
 
@@ -1179,14 +1173,13 @@ static void submodule_push_check(const char *path, const char *head,
 				 const struct refspec *rs)
 {
 	struct child_process cp = CHILD_PROCESS_INIT;
-	int i;
 
 	strvec_push(&cp.args, "submodule--helper");
 	strvec_push(&cp.args, "push-check");
 	strvec_push(&cp.args, head);
 	strvec_push(&cp.args, remote->name);
 
-	for (i = 0; i < rs->raw_nr; i++)
+	for (int i = 0; i < rs->raw_nr; i++)
 		strvec_push(&cp.args, rs->raw[i]);
 
 	prepare_submodule_repo_env(&cp.env);
@@ -1828,7 +1821,6 @@ int fetch_submodules(struct repository *r,
 		     int default_option,
 		     int quiet, int max_parallel_jobs)
 {
-	int i;
 	struct submodule_parallel_fetch spf = SPF_INIT;
 	const struct run_process_parallel_opts opts = {
 		.tr2_category = "submodule",
@@ -1855,7 +1847,7 @@ int fetch_submodules(struct repository *r,
 		die(_("index file corrupt"));
 
 	strvec_push(&spf.args, "fetch");
-	for (i = 0; i < options->nr; i++)
+	for (int i = 0; i < options->nr; i++)
 		strvec_push(&spf.args, options->v[i]);
 	strvec_push(&spf.args, "--recurse-submodules-default");
 	/* default value, "--submodule-prefix" and its value are added later */
diff --git a/t/helper/test-bloom.c b/t/helper/test-bloom.c
index 1281e66876..5292463421 100644
--- a/t/helper/test-bloom.c
+++ b/t/helper/test-bloom.c
@@ -9,11 +9,10 @@ static struct bloom_filter_settings settings = DEFAULT_BLOOM_FILTER_SETTINGS;
 
 static void add_string_to_filter(const char *data, struct bloom_filter *filter) {
 		struct bloom_key key;
-		int i;
 
 		fill_bloom_key(data, strlen(data), &key, &settings);
 		printf("Hashes:");
-		for (i = 0; i < settings.num_hashes; i++){
+		for (int i = 0; i < settings.num_hashes; i++){
 			printf("0x%08x|", key.hashes[i]);
 		}
 		printf("\n");
@@ -22,15 +21,13 @@ static void add_string_to_filter(const char *data, struct bloom_filter *filter)
 }
 
 static void print_bloom_filter(struct bloom_filter *filter) {
-	int i;
-
 	if (!filter) {
 		printf("No filter.\n");
 		return;
 	}
 	printf("Filter_Length:%d\n", (int)filter->len);
 	printf("Filter_Data:");
-	for (i = 0; i < filter->len; i++) {
+	for (int i = 0; i < filter->len; i++) {
 		printf("%02x|", filter->data[i]);
 	}
 	printf("\n");
diff --git a/t/helper/test-dump-cache-tree.c b/t/helper/test-dump-cache-tree.c
index c38f546e4f..2e7ea4ae0a 100644
--- a/t/helper/test-dump-cache-tree.c
+++ b/t/helper/test-dump-cache-tree.c
@@ -23,7 +23,6 @@ static int dump_cache_tree(struct cache_tree *it,
 			   struct cache_tree *ref,
 			   const char *pfx)
 {
-	int i;
 	int errs = 0;
 
 	if (!it || !ref)
@@ -46,7 +45,7 @@ static int dump_cache_tree(struct cache_tree *it,
 		}
 	}
 
-	for (i = 0; i < it->subtree_nr; i++) {
+	for (int i = 0; i < it->subtree_nr; i++) {
 		char path[PATH_MAX];
 		struct cache_tree_sub *down = it->down[i];
 		struct cache_tree_sub *rdwn;
diff --git a/t/helper/test-dump-fsmonitor.c b/t/helper/test-dump-fsmonitor.c
index 4f215fea02..5aebfafccb 100644
--- a/t/helper/test-dump-fsmonitor.c
+++ b/t/helper/test-dump-fsmonitor.c
@@ -6,7 +6,6 @@
 int cmd__dump_fsmonitor(int ac UNUSED, const char **av UNUSED)
 {
 	struct index_state *istate = the_repository->index;
-	int i;
 
 	setup_git_directory();
 	if (do_read_index(istate, the_repository->index_file, 0) < 0)
@@ -17,7 +16,7 @@ int cmd__dump_fsmonitor(int ac UNUSED, const char **av UNUSED)
 	}
 	printf("fsmonitor last update %s\n", istate->fsmonitor_last_update);
 
-	for (i = 0; i < istate->cache_nr; i++)
+	for (int i = 0; i < istate->cache_nr; i++)
 		printf((istate->cache[i]->ce_flags & CE_FSMONITOR_VALID) ? "+" : "-");
 
 	return 0;
diff --git a/t/helper/test-dump-split-index.c b/t/helper/test-dump-split-index.c
index f29d18ef94..4b9d493a18 100644
--- a/t/helper/test-dump-split-index.c
+++ b/t/helper/test-dump-split-index.c
@@ -15,7 +15,6 @@ static void show_bit(size_t pos, void *data UNUSED)
 int cmd__dump_split_index(int ac UNUSED, const char **av)
 {
 	struct split_index *si;
-	int i;
 
 	setup_git_directory();
 
@@ -27,7 +26,7 @@ int cmd__dump_split_index(int ac UNUSED, const char **av)
 		return 0;
 	}
 	printf("base %s\n", oid_to_hex(&si->base_oid));
-	for (i = 0; i < the_index.cache_nr; i++) {
+	for (int i = 0; i < the_index.cache_nr; i++) {
 		struct cache_entry *ce = the_index.cache[i];
 		printf("%06o %s %d\t%s\n", ce->ce_mode,
 		       oid_to_hex(&ce->oid), ce_stage(ce), ce->name);
diff --git a/t/helper/test-example-decorate.c b/t/helper/test-example-decorate.c
index 8f59f6be4c..7eaca18690 100644
--- a/t/helper/test-example-decorate.c
+++ b/t/helper/test-example-decorate.c
@@ -16,7 +16,7 @@ int cmd__example_decorate(int argc UNUSED, const char **argv UNUSED)
 
 	void *ret;
 
-	int i, objects_noticed = 0;
+	int objects_noticed = 0;
 
 	/*
 	 * The struct must be zero-initialized.
@@ -65,7 +65,7 @@ int cmd__example_decorate(int argc UNUSED, const char **argv UNUSED)
 	/*
 	 * The user can also loop through all entries.
 	 */
-	for (i = 0; i < n.size; i++) {
+	for (int i = 0; i < n.size; i++) {
 		if (n.entries[i].base)
 			objects_noticed++;
 	}
diff --git a/t/helper/test-fake-ssh.c b/t/helper/test-fake-ssh.c
index 27323cb367..4487407d5e 100644
--- a/t/helper/test-fake-ssh.c
+++ b/t/helper/test-fake-ssh.c
@@ -7,7 +7,6 @@ int cmd_main(int argc, const char **argv)
 	const char *trash_directory = getenv("TRASH_DIRECTORY");
 	struct strbuf buf = STRBUF_INIT;
 	FILE *f;
-	int i;
 	struct child_process cmd = CHILD_PROCESS_INIT;
 
 	/* First, print all parameters into $TRASH_DIRECTORY/ssh-output */
@@ -18,7 +17,7 @@ int cmd_main(int argc, const char **argv)
 	if (!f)
 		die("Could not write to %s", buf.buf);
 	strbuf_release(&buf);
-	for (i = 0; i < argc; i++)
+	for (int i = 0; i < argc; i++)
 		fprintf(f, "%s%s", i > 0 ? " " : "", i > 0 ? argv[i] : "ssh:");
 	fprintf(f, "\n");
 	fclose(f);
diff --git a/t/helper/test-find-pack.c b/t/helper/test-find-pack.c
index e8bd793e58..d270b20b1f 100644
--- a/t/helper/test-find-pack.c
+++ b/t/helper/test-find-pack.c
@@ -21,7 +21,6 @@ static const char *find_pack_usage[] = {
 int cmd__find_pack(int argc, const char **argv)
 {
 	struct object_id oid;
-	struct packed_git *p;
 	int count = -1, actual_count = 0;
 	const char *prefix = setup_git_directory();
 
@@ -37,7 +36,7 @@ int cmd__find_pack(int argc, const char **argv)
 	if (repo_get_oid(the_repository, argv[0], &oid))
 		die("cannot parse %s as an object name", argv[0]);
 
-	for (p = get_all_packs(the_repository); p; p = p->next)
+	for (struct packed_git *p = get_all_packs(the_repository); p; p = p->next)
 		if (find_pack_entry_one(oid.hash, p)) {
 			printf("%s\n", p->pack_name);
 			actual_count++;
diff --git a/t/helper/test-fsmonitor-client.c b/t/helper/test-fsmonitor-client.c
index 8280984d08..4bb7e275f3 100644
--- a/t/helper/test-fsmonitor-client.c
+++ b/t/helper/test-fsmonitor-client.c
@@ -99,12 +99,11 @@ static void *hammer_thread_proc(void *_hammer_thread_data)
 {
 	struct hammer_thread_data *data = _hammer_thread_data;
 	struct strbuf answer = STRBUF_INIT;
-	int k;
 	int ret;
 
 	trace2_thread_start("hammer");
 
-	for (k = 0; k < data->nr_requests; k++) {
+	for (int k = 0; k < data->nr_requests; k++) {
 		strbuf_reset(&answer);
 
 		ret = fsmonitor_ipc__send_query(data->token, &answer);
diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c
index 187a115d57..051cb3f18c 100644
--- a/t/helper/test-lazy-init-name-hash.c
+++ b/t/helper/test-lazy-init-name-hash.c
@@ -68,9 +68,7 @@ static uint64_t time_runs(int try_threaded)
 	uint64_t sum = 0;
 	uint64_t avg;
 	int nr_threads_used;
-	int i;
-
-	for (i = 0; i < count; i++) {
+	for (int i = 0; i < count; i++) {
 		t0 = getnanotime();
 		repo_read_index(the_repository);
 		t1 = getnanotime();
diff --git a/t/helper/test-mergesort.c b/t/helper/test-mergesort.c
index 42ccc87051..a41ae530d8 100644
--- a/t/helper/test-mergesort.c
+++ b/t/helper/test-mergesort.c
@@ -64,30 +64,26 @@ static int sort_stdin(void)
 
 static void dist_sawtooth(int *arr, int n, int m)
 {
-	int i;
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		arr[i] = i % m;
 }
 
 static void dist_rand(int *arr, int n, int m)
 {
-	int i;
 	uint32_t seed = 1;
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		arr[i] = minstd_rand(&seed) % m;
 }
 
 static void dist_stagger(int *arr, int n, int m)
 {
-	int i;
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		arr[i] = (i * m + i) % n;
 }
 
 static void dist_plateau(int *arr, int n, int m)
 {
-	int i;
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		arr[i] = (i < m) ? i : m;
 }
 
@@ -114,8 +110,7 @@ static struct dist {
 
 static const struct dist *get_dist_by_name(const char *name)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(dist); i++) {
+	for (int i = 0; i < ARRAY_SIZE(dist); i++) {
 	       if (!strcmp(dist[i].name, name))
 		       return &dist[i];
 	}
@@ -159,8 +154,7 @@ static void mode_sort(int *arr, int n)
 
 static void mode_dither(int *arr, int n)
 {
-	int i;
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		arr[i] += i % 5;
 }
 
@@ -237,8 +231,7 @@ static struct mode {
 
 static const struct mode *get_mode_by_name(const char *name)
 {
-	int i;
-	for (i = 0; i < ARRAY_SIZE(mode); i++) {
+	for (int i = 0; i < ARRAY_SIZE(mode); i++) {
 	       if (!strcmp(mode[i].name, name))
 		       return &mode[i];
 	}
@@ -249,7 +242,7 @@ static int generate(int argc, const char **argv)
 {
 	const struct dist *dist = NULL;
 	const struct mode *mode = NULL;
-	int i, n, m, *arr;
+	int n, m, *arr;
 
 	if (argc != 4)
 		return 1;
@@ -264,7 +257,7 @@ static int generate(int argc, const char **argv)
 	ALLOC_ARRAY(arr, n);
 	dist->fn(arr, n, m);
 	mode->fn(arr, n);
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		printf("%08x\n", arr[i]);
 	free(arr);
 	return 0;
diff --git a/t/helper/test-pack-mtimes.c b/t/helper/test-pack-mtimes.c
index 67a964ef90..16c9134cf1 100644
--- a/t/helper/test-pack-mtimes.c
+++ b/t/helper/test-pack-mtimes.c
@@ -8,11 +8,10 @@
 
 static void dump_mtimes(struct packed_git *p)
 {
-	uint32_t i;
 	if (load_pack_mtimes(p) < 0)
 		die("could not load pack .mtimes");
 
-	for (i = 0; i < p->num_objects; i++) {
+	for (uint32_t i = 0; i < p->num_objects; i++) {
 		struct object_id oid;
 		if (nth_packed_object_id(&oid, p, i) < 0)
 			die("could not load object id at position %"PRIu32, i);
diff --git a/t/helper/test-parse-options.c b/t/helper/test-parse-options.c
index ded8116cc5..c11a4ba222 100644
--- a/t/helper/test-parse-options.c
+++ b/t/helper/test-parse-options.c
@@ -213,8 +213,7 @@ int cmd__parse_options(int argc, const char **argv)
 
 static void print_args(int argc, const char **argv)
 {
-	int i;
-	for (i = 0; i < argc; i++)
+	for (int i = 0; i < argc; i++)
 		printf("arg %02d: %s\n", i, argv[i]);
 }
 
diff --git a/t/helper/test-parse-pathspec-file.c b/t/helper/test-parse-pathspec-file.c
index 89ecefd1cd..59af46b00f 100644
--- a/t/helper/test-parse-pathspec-file.c
+++ b/t/helper/test-parse-pathspec-file.c
@@ -6,7 +6,7 @@ int cmd__parse_pathspec_file(int argc, const char **argv)
 {
 	struct pathspec pathspec;
 	char *pathspec_from_file = NULL;
-	int pathspec_file_nul = 0, i;
+	int pathspec_file_nul = 0;
 
 	static const char *const usage[] = {
 		"test-tool parse-pathspec-file --pathspec-from-file [--pathspec-file-nul]",
@@ -24,7 +24,7 @@ int cmd__parse_pathspec_file(int argc, const char **argv)
 	parse_pathspec_file(&pathspec, 0, 0, NULL, pathspec_from_file,
 			    pathspec_file_nul);
 
-	for (i = 0; i < pathspec.nr; i++)
+	for (int i = 0; i < pathspec.nr; i++)
 		printf("%s\n", pathspec.items[i].original);
 
 	clear_pathspec(&pathspec);
diff --git a/t/helper/test-path-utils.c b/t/helper/test-path-utils.c
index 70396fa384..4f3d8dda84 100644
--- a/t/helper/test-path-utils.c
+++ b/t/helper/test-path-utils.c
@@ -63,11 +63,11 @@ static char *posix_dirname(char *path)
 static int test_function(struct test_data *data, char *(*func)(char *input),
 	const char *funcname)
 {
-	int failed = 0, i;
+	int failed = 0;
 	char buffer[1024];
 	char *to;
 
-	for (i = 0; data[i].to; i++) {
+	for (int i = 0; data[i].to; i++) {
 		if (!data[i].from)
 			to = func(NULL);
 		else {
@@ -425,10 +425,10 @@ int cmd__path_utils(int argc, const char **argv)
 	}
 
 	if (argc > 2 && !strcmp(argv[1], "file-size")) {
-		int res = 0, i;
+		int res = 0;
 		struct stat st;
 
-		for (i = 2; i < argc; i++)
+		for (int i = 2; i < argc; i++)
 			if (stat(argv[i], &st))
 				res = error_errno("Cannot stat '%s'", argv[i]);
 			else
@@ -484,9 +484,9 @@ int cmd__path_utils(int argc, const char **argv)
 		return !!protect_ntfs_hfs_benchmark(argc - 1, argv + 1);
 
 	if (argc > 1 && !strcmp(argv[1], "is_valid_path")) {
-		int res = 0, expect = 1, i;
+		int res = 0, expect = 1;
 
-		for (i = 2; i < argc; i++)
+		for (int i = 2; i < argc; i++)
 			if (!strcmp("--not", argv[i]))
 				expect = 0;
 			else if (expect != is_valid_path(argv[i]))
diff --git a/t/helper/test-pkt-line.c b/t/helper/test-pkt-line.c
index 4daa82f00f..7d5dc5d804 100644
--- a/t/helper/test-pkt-line.c
+++ b/t/helper/test-pkt-line.c
@@ -18,8 +18,7 @@ static void pack_line(const char *line)
 static void pack(int argc, const char **argv)
 {
 	if (argc) { /* read from argv */
-		int i;
-		for (i = 0; i < argc; i++)
+		for (int i = 0; i < argc; i++)
 			pack_line(argv[i]);
 	} else { /* read from stdin */
 		char line[LARGE_PACKET_MAX];
diff --git a/t/helper/test-proc-receive.c b/t/helper/test-proc-receive.c
index f30022d222..b04220cdd5 100644
--- a/t/helper/test-proc-receive.c
+++ b/t/helper/test-proc-receive.c
@@ -169,14 +169,12 @@ int cmd__proc_receive(int argc, const char **argv)
 	proc_receive_read_push_options(&reader, &push_options);
 
 	if (verbose) {
-		struct command *cmd;
-
 		if (use_push_options || use_atomic)
 			fprintf(stderr, "proc-receive:%s%s\n",
 				use_atomic? " atomic": "",
 				use_push_options ? " push_options": "");
 
-		for (cmd = commands; cmd; cmd = cmd->next)
+		for (struct command *cmd = commands; cmd; cmd = cmd->next)
 			fprintf(stderr, "proc-receive< %s %s %s\n",
 				oid_to_hex(&cmd->old_oid),
 				oid_to_hex(&cmd->new_oid),
diff --git a/t/helper/test-reach.c b/t/helper/test-reach.c
index 1e159a754d..85f895af42 100644
--- a/t/helper/test-reach.c
+++ b/t/helper/test-reach.c
@@ -11,7 +11,6 @@
 
 static void print_sorted_commit_ids(struct commit_list *list)
 {
-	int i;
 	struct string_list s = STRING_LIST_INIT_DUP;
 
 	while (list) {
@@ -21,7 +20,7 @@ static void print_sorted_commit_ids(struct commit_list *list)
 
 	string_list_sort(&s);
 
-	for (i = 0; i < s.nr; i++)
+	for (int i = 0; i < s.nr; i++)
 		printf("%s\n", s.items[i].string);
 
 	string_list_clear(&s, 0);
@@ -148,19 +147,18 @@ int cmd__reach(int ac, const char **av)
 		printf("%s(_,A,X,_):%d\n", av[1], commit_contains(&filter, A, X, &cache));
 	} else if (!strcmp(av[1], "get_reachable_subset")) {
 		const int reachable_flag = 1;
-		int i, count = 0;
-		struct commit_list *current;
+		int count = 0;
 		struct commit_list *list = get_reachable_subset(X_array, X_nr,
 								Y_array, Y_nr,
 								reachable_flag);
 		printf("get_reachable_subset(X,Y)\n");
-		for (current = list; current; current = current->next) {
+		for (struct commit_list *current = list; current; current = current->next) {
 			if (!(list->item->object.flags & reachable_flag))
 				die(_("commit %s is not marked reachable"),
 				    oid_to_hex(&list->item->object.oid));
 			count++;
 		}
-		for (i = 0; i < Y_nr; i++) {
+		for (int i = 0; i < Y_nr; i++) {
 			if (Y_array[i]->object.flags & reachable_flag)
 				count--;
 		}
diff --git a/t/helper/test-read-cache.c b/t/helper/test-read-cache.c
index 1acd362346..5ace22d38a 100644
--- a/t/helper/test-read-cache.c
+++ b/t/helper/test-read-cache.c
@@ -7,7 +7,7 @@
 
 int cmd__read_cache(int argc, const char **argv)
 {
-	int i, cnt = 1;
+	int cnt = 1;
 	const char *name = NULL;
 
 	initialize_the_repository();
@@ -22,7 +22,7 @@ int cmd__read_cache(int argc, const char **argv)
 	setup_git_directory();
 	git_config(git_default_config, NULL);
 
-	for (i = 0; i < cnt; i++) {
+	for (int i = 0; i < cnt; i++) {
 		repo_read_index(the_repository);
 		if (name) {
 			int pos;
diff --git a/t/helper/test-read-midx.c b/t/helper/test-read-midx.c
index 4acae41bb9..48d751ba87 100644
--- a/t/helper/test-read-midx.c
+++ b/t/helper/test-read-midx.c
@@ -101,7 +101,6 @@ static int read_midx_bitmapped_packs(const char *object_dir)
 {
 	struct multi_pack_index *midx = NULL;
 	struct bitmapped_pack pack;
-	uint32_t i;
 
 	setup_git_directory();
 
@@ -109,7 +108,7 @@ static int read_midx_bitmapped_packs(const char *object_dir)
 	if (!midx)
 		return 1;
 
-	for (i = 0; i < midx->num_packs; i++) {
+	for (uint32_t i = 0; i < midx->num_packs; i++) {
 		if (nth_bitmapped_pack(the_repository, midx, &pack, i) < 0)
 			return 1;
 
diff --git a/t/helper/test-ref-store.c b/t/helper/test-ref-store.c
index 702ec1f128..3a4099decf 100644
--- a/t/helper/test-ref-store.c
+++ b/t/helper/test-ref-store.c
@@ -346,7 +346,6 @@ int cmd__ref_store(int argc UNUSED, const char **argv)
 {
 	struct ref_store *refs;
 	const char *func;
-	struct command *cmd;
 
 	setup_git_directory();
 
@@ -355,7 +354,7 @@ int cmd__ref_store(int argc UNUSED, const char **argv)
 	func = *argv++;
 	if (!func)
 		die("ref function required");
-	for (cmd = commands; cmd->name; cmd++) {
+	for (struct command *cmd = commands; cmd->name; cmd++) {
 		if (!strcmp(func, cmd->name))
 			return cmd->func(refs, argv);
 	}
diff --git a/t/helper/test-repository.c b/t/helper/test-repository.c
index 0c7c5aa4dd..c6049eda11 100644
--- a/t/helper/test-repository.c
+++ b/t/helper/test-repository.c
@@ -13,7 +13,6 @@ static void test_parse_commit_in_graph(const char *gitdir, const char *worktree,
 {
 	struct repository r;
 	struct commit *c;
-	struct commit_list *parent;
 
 	setup_git_env(gitdir);
 
@@ -30,7 +29,7 @@ static void test_parse_commit_in_graph(const char *gitdir, const char *worktree,
 		die("Couldn't parse commit");
 
 	printf("%"PRItime, c->date);
-	for (parent = c->parents; parent; parent = parent->next)
+	for (struct commit_list *parent = c->parents; parent; parent = parent->next)
 		printf(" %s", oid_to_hex(&parent->item->object.oid));
 	printf("\n");
 
diff --git a/t/helper/test-rot13-filter.c b/t/helper/test-rot13-filter.c
index f8d564c622..1461bb6fac 100644
--- a/t/helper/test-rot13-filter.c
+++ b/t/helper/test-rot13-filter.c
@@ -53,8 +53,7 @@ static inline const char *str_or_null(const char *str)
 
 static char *rot13(char *str)
 {
-	char *c;
-	for (c = str; *c; c++)
+	for (char *c = str; *c; c++)
 		if (isalpha(*c))
 			*c += tolower(*c) < 'n' ? 13 : -13;
 	return str;
@@ -108,8 +107,7 @@ static void read_capabilities(struct strset *remote_caps)
 static void check_and_write_capabilities(struct strset *remote_caps,
 					 const char **caps, int nr_caps)
 {
-	int i;
-	for (i = 0; i < nr_caps; i++) {
+	for (int i = 0; i < nr_caps; i++) {
 		if (!strset_contains(remote_caps, caps[i]))
 			die("our capability '%s' is not available from remote",
 			    caps[i]);
@@ -330,7 +328,7 @@ static const char *rot13_usage[] = {
 
 int cmd__rot13_filter(int argc, const char **argv)
 {
-	int i, nr_caps;
+	int nr_caps;
 	struct strset remote_caps = STRSET_INIT;
 	const char *log_path = NULL;
 
@@ -351,7 +349,7 @@ int cmd__rot13_filter(int argc, const char **argv)
 	if (!logfile)
 		die_errno("failed to open log file");
 
-	for (i = 0; i < nr_caps; i++) {
+	for (int i = 0; i < nr_caps; i++) {
 		if (!strcmp(argv[i], "smudge"))
 			has_smudge_cap = 1;
 		if (!strcmp(argv[i], "clean"))
diff --git a/t/helper/test-run-command.c b/t/helper/test-run-command.c
index c0ed8722c8..e8d854de2e 100644
--- a/t/helper/test-run-command.c
+++ b/t/helper/test-run-command.c
@@ -230,7 +230,7 @@ static int quote_stress_test(int argc, const char **argv)
 	 * were passed in.
 	 */
 	char special[] = ".?*\\^_\"'`{}()[]<>@~&+:;$%"; // \t\r\n\a";
-	int i, j, k, trials = 100, skip = 0, msys2 = 0;
+	int j, k, trials = 100, skip = 0, msys2 = 0;
 	struct strbuf out = STRBUF_INIT;
 	struct strvec args = STRVEC_INIT;
 	struct option options[] = {
@@ -248,7 +248,7 @@ static int quote_stress_test(int argc, const char **argv)
 
 	setenv("MSYS_NO_PATHCONV", "1", 0);
 
-	for (i = 0; i < trials; i++) {
+	for (int i = 0; i < trials; i++) {
 		struct child_process cp = CHILD_PROCESS_INIT;
 		size_t arg_count, arg_offset;
 		int ret = 0;
diff --git a/t/helper/test-simple-ipc.c b/t/helper/test-simple-ipc.c
index fb5927775d..022c022ae0 100644
--- a/t/helper/test-simple-ipc.c
+++ b/t/helper/test-simple-ipc.c
@@ -49,10 +49,9 @@ static int app__big_command(ipc_server_reply_cb *reply_cb,
 			    struct ipc_server_reply_data *reply_data)
 {
 	struct strbuf buf = STRBUF_INIT;
-	int row;
 	int ret;
 
-	for (row = 0; row < BIG_ROWS; row++)
+	for (int row = 0; row < BIG_ROWS; row++)
 		strbuf_addf(&buf, "big: %.75d\n", row);
 
 	ret = reply_cb(reply_data, buf.buf, buf.len);
@@ -70,10 +69,9 @@ static int app__chunk_command(ipc_server_reply_cb *reply_cb,
 			      struct ipc_server_reply_data *reply_data)
 {
 	struct strbuf buf = STRBUF_INIT;
-	int row;
 	int ret;
 
-	for (row = 0; row < CHUNK_ROWS; row++) {
+	for (int row = 0; row < CHUNK_ROWS; row++) {
 		strbuf_setlen(&buf, 0);
 		strbuf_addf(&buf, "big: %.75d\n", row);
 		ret = reply_cb(reply_data, buf.buf, buf.len);
@@ -95,10 +93,9 @@ static int app__slow_command(ipc_server_reply_cb *reply_cb,
 			     struct ipc_server_reply_data *reply_data)
 {
 	struct strbuf buf = STRBUF_INIT;
-	int row;
 	int ret;
 
-	for (row = 0; row < SLOW_ROWS; row++) {
+	for (int row = 0; row < SLOW_ROWS; row++) {
 		strbuf_setlen(&buf, 0);
 		strbuf_addf(&buf, "big: %.75d\n", row);
 		ret = reply_cb(reply_data, buf.buf, buf.len);
@@ -120,7 +117,6 @@ static int app__sendbytes_command(const char *received, size_t received_len,
 	struct strbuf buf_resp = STRBUF_INIT;
 	const char *p = "?";
 	int len_ballast = 0;
-	int k;
 	int errs = 0;
 	int ret;
 
@@ -138,7 +134,7 @@ static int app__sendbytes_command(const char *received, size_t received_len,
 	 * Verify that the ballast is n copies of a single letter.
 	 * And that the multi-threaded IO layer didn't cross the streams.
 	 */
-	for (k = 1; k < len_ballast; k++)
+	for (int k = 1; k < len_ballast; k++)
 		if (p[k] != p[0])
 			errs++;
 
@@ -500,7 +496,6 @@ struct multiple_thread_data {
 static void *multiple_thread_proc(void *_multiple_thread_data)
 {
 	struct multiple_thread_data *d = _multiple_thread_data;
-	int k;
 	struct ipc_client_connect_options options
 		= IPC_CLIENT_CONNECT_OPTIONS_INIT;
 
@@ -515,7 +510,7 @@ static void *multiple_thread_proc(void *_multiple_thread_data)
 
 	trace2_thread_start("multiple");
 
-	for (k = 0; k < d->batchsize; k++) {
+	for (int k = 0; k < d->batchsize; k++) {
 		if (do_sendbytes(d->bytecount + k, d->letter, d->path, &options))
 			d->sum_errors++;
 		else
@@ -533,12 +528,11 @@ static void *multiple_thread_proc(void *_multiple_thread_data)
 static int client__multiple(void)
 {
 	struct multiple_thread_data *list = NULL;
-	int k;
 	int sum_join_errors = 0;
 	int sum_thread_errors = 0;
 	int sum_good = 0;
 
-	for (k = 0; k < cl_args.nr_threads; k++) {
+	for (int k = 0; k < cl_args.nr_threads; k++) {
 		struct multiple_thread_data *d = xcalloc(1, sizeof(*d));
 		d->next = list;
 		d->path = cl_args.path;
diff --git a/t/helper/test-string-list.c b/t/helper/test-string-list.c
index e2aad611d1..4f465d399f 100644
--- a/t/helper/test-string-list.c
+++ b/t/helper/test-string-list.c
@@ -18,8 +18,7 @@ static void parse_string_list(struct string_list *list, const char *arg)
 
 static void write_list(const struct string_list *list)
 {
-	int i;
-	for (i = 0; i < list->nr; i++)
+	for (int i = 0; i < list->nr; i++)
 		printf("[%d]: \"%s\"\n", i, list->items[i].string);
 }
 
diff --git a/t/helper/test-submodule.c b/t/helper/test-submodule.c
index 7197969a08..773aec81ec 100644
--- a/t/helper/test-submodule.c
+++ b/t/helper/test-submodule.c
@@ -224,14 +224,13 @@ int cmd__submodule(int argc, const char **argv)
 	struct option options[] = {
 		OPT_END()
 	};
-	size_t i;
 
 	argc = parse_options(argc, argv, "test-tools", options, submodule_usage,
 			     PARSE_OPT_STOP_AT_NON_OPTION);
 	if (argc < 1)
 		usage_with_options(submodule_usage, options);
 
-	for (i = 0; i < ARRAY_SIZE(cmds); i++)
+	for (size_t i = 0; i < ARRAY_SIZE(cmds); i++)
 		if (!strcmp(cmds[i].name, argv[0]))
 			return cmds[i].fn(argc, argv);
 
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 482a1e58a4..fb4749d1cf 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -96,17 +96,14 @@ static struct test_cmd cmds[] = {
 
 static NORETURN void die_usage(void)
 {
-	size_t i;
-
 	fprintf(stderr, "usage: test-tool <toolname> [args]\n");
-	for (i = 0; i < ARRAY_SIZE(cmds); i++)
+	for (size_t i = 0; i < ARRAY_SIZE(cmds); i++)
 		fprintf(stderr, "  %s\n", cmds[i].name);
 	exit(128);
 }
 
 int cmd_main(int argc, const char **argv)
 {
-	int i;
 	const char *working_directory = NULL;
 	struct option options[] = {
 		OPT_STRING('C', NULL, &working_directory, "directory",
@@ -125,7 +122,7 @@ int cmd_main(int argc, const char **argv)
 	if (working_directory && chdir(working_directory) < 0)
 		die("Could not cd to '%s'", working_directory);
 
-	for (i = 0; i < ARRAY_SIZE(cmds); i++) {
+	for (int i = 0; i < ARRAY_SIZE(cmds); i++) {
 		if (!strcmp(cmds[i].name, argv[1])) {
 			argv++;
 			argc--;
diff --git a/t/helper/test-trace2.c b/t/helper/test-trace2.c
index 1adac29a57..74e3c13e2c 100644
--- a/t/helper/test-trace2.c
+++ b/t/helper/test-trace2.c
@@ -87,12 +87,10 @@ static int ut_002exit(int argc UNUSED, const char **argv)
  */
 static int ut_003error(int argc, const char **argv)
 {
-	int k;
-
 	if (!argv[0] || !*argv[0])
 		die("expect <error_message>");
 
-	for (k = 0; k < argc; k++)
+	for (int k = 0; k < argc; k++)
 		error("%s", argv[k]);
 
 	return 0;
@@ -244,7 +242,6 @@ static int ut_100timer(int argc, const char **argv)
 
 	int count = 0;
 	int delay = 0;
-	int k;
 
 	if (argc != 2)
 		die("%s", usage_error);
@@ -253,7 +250,7 @@ static int ut_100timer(int argc, const char **argv)
 	if (get_i(&delay, argv[1]))
 		die("%s", usage_error);
 
-	for (k = 0; k < count; k++) {
+	for (int k = 0; k < count; k++) {
 		trace2_timer_start(TRACE2_TIMER_ID_TEST1);
 		sleep_millisec(delay);
 		trace2_timer_stop(TRACE2_TIMER_ID_TEST1);
@@ -270,11 +267,10 @@ struct ut_101_data {
 static void *ut_101timer_thread_proc(void *_ut_101_data)
 {
 	struct ut_101_data *data = _ut_101_data;
-	int k;
 
 	trace2_thread_start("ut_101");
 
-	for (k = 0; k < data->count; k++) {
+	for (int k = 0; k < data->count; k++) {
 		trace2_timer_start(TRACE2_TIMER_ID_TEST2);
 		sleep_millisec(data->delay);
 		trace2_timer_stop(TRACE2_TIMER_ID_TEST2);
@@ -336,12 +332,11 @@ static int ut_200counter(int argc, const char **argv)
 	const char *usage_error =
 		"expect <v1> [<v2> [...]]";
 	int value;
-	int k;
 
 	if (argc < 1)
 		die("%s", usage_error);
 
-	for (k = 0; k < argc; k++) {
+	for (int k = 0; k < argc; k++) {
 		if (get_i(&value, argv[k]))
 			die("invalid value[%s] -- %s",
 			    argv[k], usage_error);
@@ -425,12 +420,11 @@ static int ut_300redact_start(int argc, const char **argv)
 static int ut_301redact_child_start(int argc, const char **argv)
 {
 	struct child_process cmd = CHILD_PROCESS_INIT;
-	int k;
 
 	if (!argc)
 		die("expect <argv...>");
 
-	for (k = 0; argv[k]; k++)
+	for (int k = 0; argv[k]; k++)
 		strvec_push(&cmd.args, argv[k]);
 
 	trace2_child_start(&cmd);
diff --git a/t/helper/test-wildmatch.c b/t/helper/test-wildmatch.c
index b4ff5f986a..81935ff3fb 100644
--- a/t/helper/test-wildmatch.c
+++ b/t/helper/test-wildmatch.c
@@ -3,8 +3,7 @@
 
 int cmd__wildmatch(int argc, const char **argv)
 {
-	int i;
-	for (i = 2; i < argc; i++) {
+	for (int i = 2; i < argc; i++) {
 		if (argv[i][0] == '/')
 			die("Forward slash is not allowed at the beginning of the\n"
 			    "pattern because Windows does not like it. Use `XXX/' instead.");
diff --git a/t/helper/test-write-cache.c b/t/helper/test-write-cache.c
index f084034d38..b585358253 100644
--- a/t/helper/test-write-cache.c
+++ b/t/helper/test-write-cache.c
@@ -8,12 +8,12 @@
 int cmd__write_cache(int argc, const char **argv)
 {
 	struct lock_file index_lock = LOCK_INIT;
-	int i, cnt = 1;
+	int cnt = 1;
 	if (argc == 2)
 		cnt = strtol(argv[1], NULL, 0);
 	setup_git_directory();
 	repo_read_index(the_repository);
-	for (i = 0; i < cnt; i++) {
+	for (int i = 0; i < cnt; i++) {
 		repo_hold_locked_index(the_repository, &index_lock,
 				       LOCK_DIE_ON_ERROR);
 		if (write_locked_index(&the_index, &index_lock, COMMIT_LOCK))
diff --git a/t/unit-tests/test-lib.c b/t/unit-tests/test-lib.c
index 66d6980ffb..484a6e9fe9 100644
--- a/t/unit-tests/test-lib.c
+++ b/t/unit-tests/test-lib.c
@@ -31,7 +31,7 @@ static struct {
 
 static const char *make_relative(const char *location)
 {
-	static char prefix[] = __FILE__, buf[PATH_MAX], *p;
+	static char prefix[] = __FILE__, buf[PATH_MAX];
 	static size_t prefix_len;
 	static int need_bs_to_fs = -1;
 
@@ -88,7 +88,7 @@ static const char *make_relative(const char *location)
 
 	/* convert backslashes to forward slashes */
 	strlcpy(buf, location + prefix_len, sizeof(buf));
-	for (p = buf; *p; p++)
+	for (char *p = buf; *p; p++)
 		if (*p == '\\')
 			*p = '/';
 	return buf;
diff --git a/tmp-objdir.c b/tmp-objdir.c
index 3509258be5..4ac96bf16e 100644
--- a/tmp-objdir.c
+++ b/tmp-objdir.c
@@ -225,7 +225,6 @@ static int migrate_paths(struct strbuf *src, struct strbuf *dst)
 {
 	size_t src_len = src->len, dst_len = dst->len;
 	struct string_list paths = STRING_LIST_INIT_DUP;
-	int i;
 	int ret = 0;
 
 	if (read_dir_paths(&paths, src->buf) < 0)
@@ -233,7 +232,7 @@ static int migrate_paths(struct strbuf *src, struct strbuf *dst)
 	paths.cmp = pack_copy_cmp;
 	string_list_sort(&paths);
 
-	for (i = 0; i < paths.nr; i++) {
+	for (int i = 0; i < paths.nr; i++) {
 		const char *name = paths.items[i].string;
 
 		strbuf_addf(src, "/%s", name);
diff --git a/trace2/tr2_cfg.c b/trace2/tr2_cfg.c
index d96d908bb9..634f499d5a 100644
--- a/trace2/tr2_cfg.c
+++ b/trace2/tr2_cfg.c
@@ -103,10 +103,9 @@ struct tr2_cfg_data {
 static int tr2_cfg_cb(const char *key, const char *value,
 		      const struct config_context *ctx, void *d)
 {
-	struct strbuf **s;
 	struct tr2_cfg_data *data = (struct tr2_cfg_data *)d;
 
-	for (s = tr2_cfg_patterns; *s; s++) {
+	for (struct strbuf **s = tr2_cfg_patterns; *s; s++) {
 		struct strbuf *buf = *s;
 		int wm = wildmatch(buf->buf, key, WM_CASEFOLD);
 		if (wm == WM_MATCH) {
@@ -130,13 +129,12 @@ void tr2_cfg_list_config_fl(const char *file, int line)
 void tr2_list_env_vars_fl(const char *file, int line)
 {
 	struct key_value_info kvi = KVI_INIT;
-	struct strbuf **s;
 
 	kvi_from_param(&kvi);
 	if (tr2_load_env_vars() <= 0)
 		return;
 
-	for (s = tr2_cfg_env_vars; *s; s++) {
+	for (struct strbuf **s = tr2_cfg_env_vars; *s; s++) {
 		struct strbuf *buf = *s;
 		const char *val = getenv(buf->buf);
 		if (val && *val)
diff --git a/trace2/tr2_ctr.c b/trace2/tr2_ctr.c
index d3a33715c1..1e742ed912 100644
--- a/trace2/tr2_ctr.c
+++ b/trace2/tr2_ctr.c
@@ -60,7 +60,6 @@ void tr2_counter_increment(enum trace2_counter_id cid, uint64_t value)
 void tr2_update_final_counters(void)
 {
 	struct tr2tls_thread_ctx *ctx = tr2tls_get_self();
-	enum trace2_counter_id cid;
 
 	if (!ctx->used_any_counter)
 		return;
@@ -70,7 +69,7 @@ void tr2_update_final_counters(void)
 	 * We assume that our caller is holding the lock.
 	 */
 
-	for (cid = 0; cid < TRACE2_NUMBER_OF_COUNTERS; cid++) {
+	for (enum trace2_counter_id cid = 0; cid < TRACE2_NUMBER_OF_COUNTERS; cid++) {
 		struct tr2_counter *c_final = &final_counter_block.counter[cid];
 		const struct tr2_counter *c = &ctx->counter_block.counter[cid];
 
@@ -81,7 +80,6 @@ void tr2_update_final_counters(void)
 void tr2_emit_per_thread_counters(tr2_tgt_evt_counter_t *fn_apply)
 {
 	struct tr2tls_thread_ctx *ctx = tr2tls_get_self();
-	enum trace2_counter_id cid;
 
 	if (!ctx->used_any_per_thread_counter)
 		return;
@@ -90,7 +88,7 @@ void tr2_emit_per_thread_counters(tr2_tgt_evt_counter_t *fn_apply)
 	 * For each counter, if the counter wants per-thread events
 	 * and this thread used it (the value is non-zero), emit it.
 	 */
-	for (cid = 0; cid < TRACE2_NUMBER_OF_COUNTERS; cid++)
+	for (enum trace2_counter_id cid = 0; cid < TRACE2_NUMBER_OF_COUNTERS; cid++)
 		if (tr2_counter_metadata[cid].want_per_thread_events &&
 		    ctx->counter_block.counter[cid].value)
 			fn_apply(&tr2_counter_metadata[cid],
@@ -100,14 +98,7 @@ void tr2_emit_per_thread_counters(tr2_tgt_evt_counter_t *fn_apply)
 
 void tr2_emit_final_counters(tr2_tgt_evt_counter_t *fn_apply)
 {
-	enum trace2_counter_id cid;
-
-	/*
-	 * Access `final_counter_block` requires holding `tr2tls_mutex`.
-	 * We assume that our caller is holding the lock.
-	 */
-
-	for (cid = 0; cid < TRACE2_NUMBER_OF_COUNTERS; cid++)
+	for (enum trace2_counter_id cid = 0; cid < TRACE2_NUMBER_OF_COUNTERS; cid++)
 		if (final_counter_block.counter[cid].value)
 			fn_apply(&tr2_counter_metadata[cid],
 				 &final_counter_block.counter[cid],
diff --git a/trace2/tr2_sid.c b/trace2/tr2_sid.c
index 09c4ef0d17..fc878833a2 100644
--- a/trace2/tr2_sid.c
+++ b/trace2/tr2_sid.c
@@ -77,8 +77,7 @@ static void tr2_sid_compute(void)
 
 	parent_sid = getenv(TR2_ENVVAR_PARENT_SID);
 	if (parent_sid && *parent_sid) {
-		const char *p;
-		for (p = parent_sid; *p; p++)
+		for (const char *p = parent_sid; *p; p++)
 			if (*p == '/')
 				tr2sid_nr_git_parents++;
 
diff --git a/trace2/tr2_sysenv.c b/trace2/tr2_sysenv.c
index 048cdd5438..61737950cd 100644
--- a/trace2/tr2_sysenv.c
+++ b/trace2/tr2_sysenv.c
@@ -61,12 +61,10 @@ static int tr2_sysenv_cb(const char *key, const char *value,
 			 const struct config_context *ctx UNUSED,
 			 void *d UNUSED)
 {
-	int k;
-
 	if (!starts_with(key, "trace2."))
 		return 0;
 
-	for (k = 0; k < ARRAY_SIZE(tr2_sysenv_settings); k++) {
+	for (int k = 0; k < ARRAY_SIZE(tr2_sysenv_settings); k++) {
 		if (!strcmp(key, tr2_sysenv_settings[k].git_config_name)) {
 			if (!value)
 				return config_error_nonbool(key);
@@ -129,8 +127,6 @@ const char *tr2_sysenv_display_name(enum tr2_sysenv_variable var)
 
 void tr2_sysenv_release(void)
 {
-	int k;
-
-	for (k = 0; k < ARRAY_SIZE(tr2_sysenv_settings); k++)
+	for (int k = 0; k < ARRAY_SIZE(tr2_sysenv_settings); k++)
 		free(tr2_sysenv_settings[k].value);
 }
diff --git a/trace2/tr2_tmr.c b/trace2/tr2_tmr.c
index 51f564b07a..1665525b89 100644
--- a/trace2/tr2_tmr.c
+++ b/trace2/tr2_tmr.c
@@ -88,7 +88,6 @@ void tr2_stop_timer(enum trace2_timer_id tid)
 void tr2_update_final_timers(void)
 {
 	struct tr2tls_thread_ctx *ctx = tr2tls_get_self();
-	enum trace2_timer_id tid;
 
 	if (!ctx->used_any_timer)
 		return;
@@ -98,7 +97,7 @@ void tr2_update_final_timers(void)
 	 * We assume that our caller is holding the lock.
 	 */
 
-	for (tid = 0; tid < TRACE2_NUMBER_OF_TIMERS; tid++) {
+	for (enum trace2_timer_id tid = 0; tid < TRACE2_NUMBER_OF_TIMERS; tid++) {
 		struct tr2_timer *t_final = &final_timer_block.timer[tid];
 		struct tr2_timer *t = &ctx->timer_block.timer[tid];
 
@@ -148,7 +147,6 @@ void tr2_update_final_timers(void)
 void tr2_emit_per_thread_timers(tr2_tgt_evt_timer_t *fn_apply)
 {
 	struct tr2tls_thread_ctx *ctx = tr2tls_get_self();
-	enum trace2_timer_id tid;
 
 	if (!ctx->used_any_per_thread_timer)
 		return;
@@ -157,7 +155,7 @@ void tr2_emit_per_thread_timers(tr2_tgt_evt_timer_t *fn_apply)
 	 * For each timer, if the timer wants per-thread events and
 	 * this thread used it, emit it.
 	 */
-	for (tid = 0; tid < TRACE2_NUMBER_OF_TIMERS; tid++)
+	for (enum trace2_timer_id tid = 0; tid < TRACE2_NUMBER_OF_TIMERS; tid++)
 		if (tr2_timer_metadata[tid].want_per_thread_events &&
 		    ctx->timer_block.timer[tid].interval_count)
 			fn_apply(&tr2_timer_metadata[tid],
@@ -167,14 +165,7 @@ void tr2_emit_per_thread_timers(tr2_tgt_evt_timer_t *fn_apply)
 
 void tr2_emit_final_timers(tr2_tgt_evt_timer_t *fn_apply)
 {
-	enum trace2_timer_id tid;
-
-	/*
-	 * Accessing `final_timer_block` requires holding `tr2tls_mutex`.
-	 * We assume that our caller is holding the lock.
-	 */
-
-	for (tid = 0; tid < TRACE2_NUMBER_OF_TIMERS; tid++)
+	for (enum trace2_timer_id tid = 0; tid < TRACE2_NUMBER_OF_TIMERS; tid++)
 		if (final_timer_block.timer[tid].interval_count)
 			fn_apply(&tr2_timer_metadata[tid],
 				 &final_timer_block.timer[tid],
diff --git a/trailer.c b/trailer.c
index 3a0710a458..6eb1134826 100644
--- a/trailer.c
+++ b/trailer.c
@@ -138,8 +138,7 @@ static void free_arg_item(struct arg_item *item)
 
 static char last_non_space_char(const char *s)
 {
-	int i;
-	for (i = strlen(s) - 1; i >= 0; i--)
+	for (int i = strlen(s) - 1; i >= 0; i--)
 		if (!isspace(s[i]))
 			return s[i];
 	return '\0';
@@ -633,8 +632,7 @@ static int token_matches_item(const char *tok, struct arg_item *item, size_t tok
 static ssize_t find_separator(const char *line, const char *separators)
 {
 	int whitespace_found = 0;
-	const char *c;
-	for (c = line; *c; c++) {
+	for (const char *c = line; *c; c++) {
 		if (strchr(separators, *c))
 			return c - line;
 		if (!whitespace_found && (isalnum(*c) || *c == '-'))
@@ -840,7 +838,6 @@ static ssize_t last_line(const char *buf, size_t len)
 static size_t find_end_of_log_message(const char *input, int no_divider)
 {
 	size_t end;
-	const char *s;
 
 	/* Assume the naive end of the input is already what we want. */
 	end = strlen(input);
@@ -849,7 +846,7 @@ static size_t find_end_of_log_message(const char *input, int no_divider)
 		return end;
 
 	/* Optionally skip over any patch part ("---" line and below). */
-	for (s = input; *s; s = next_line(s)) {
+	for (const char *s = input; *s; s = next_line(s)) {
 		const char *v;
 
 		if (skip_prefix(s, "---", &v) && isspace(*v)) {
@@ -869,7 +866,7 @@ static size_t find_end_of_log_message(const char *input, int no_divider)
 static size_t find_trailer_block_start(const char *buf, size_t len)
 {
 	const char *s;
-	ssize_t end_of_title, l;
+	ssize_t end_of_title;
 	int only_spaces = 1;
 	int recognized_prefix = 0, trailer_lines = 0, non_trailer_lines = 0;
 	/*
@@ -896,9 +893,7 @@ static size_t find_trailer_block_start(const char *buf, size_t len)
 	 * trailers, or (ii) contains at least one Git-generated trailer and
 	 * consists of at least 25% trailers.
 	 */
-	for (l = last_line(buf, len);
-	     l >= end_of_title;
-	     l = last_line(buf, l)) {
+	for (ssize_t l = last_line(buf, len); l >= end_of_title; l = last_line(buf, l)) {
 		const char *bol = buf + l;
 		const char **p;
 		ssize_t separator_pos;
@@ -1007,11 +1002,10 @@ static void parse_trailers(struct trailer_info *info,
 {
 	struct strbuf tok = STRBUF_INIT;
 	struct strbuf val = STRBUF_INIT;
-	size_t i;
 
 	trailer_info_get(info, str, opts);
 
-	for (i = 0; i < info->trailer_nr; i++) {
+	for (size_t i = 0; i < info->trailer_nr; i++) {
 		int separator_pos;
 		char *trailer = info->trailers[i];
 		if (trailer[0] == comment_line_char)
@@ -1130,7 +1124,7 @@ void trailer_info_get(struct trailer_info *info, const char *str,
 		      const struct process_trailer_options *opts)
 {
 	size_t end_of_log_message = 0, trailer_block_start = 0;
-	struct strbuf **trailer_lines, **ptr;
+	struct strbuf **trailer_lines;
 	char **trailer_strings = NULL;
 	size_t nr = 0, alloc = 0;
 	char **last = NULL;
@@ -1144,7 +1138,7 @@ void trailer_info_get(struct trailer_info *info, const char *str,
 					 end_of_log_message - trailer_block_start,
 					 '\n',
 					 0);
-	for (ptr = trailer_lines; *ptr; ptr++) {
+	for (struct strbuf **ptr = trailer_lines; *ptr; ptr++) {
 		if (last && isspace((*ptr)->buf[0])) {
 			struct strbuf sb = STRBUF_INIT;
 			strbuf_attach(&sb, *last, strlen(*last), strlen(*last));
@@ -1171,8 +1165,7 @@ void trailer_info_get(struct trailer_info *info, const char *str,
 
 void trailer_info_release(struct trailer_info *info)
 {
-	size_t i;
-	for (i = 0; i < info->trailer_nr; i++)
+	for (size_t i = 0; i < info->trailer_nr; i++)
 		free(info->trailers[i]);
 	free(info->trailers);
 }
@@ -1183,7 +1176,6 @@ static void format_trailer_info(struct strbuf *out,
 				const struct process_trailer_options *opts)
 {
 	size_t origlen = out->len;
-	size_t i;
 
 	/* If we want the whole block untouched, we can take the fast path. */
 	if (!opts->only_trailers && !opts->unfold && !opts->filter &&
@@ -1194,7 +1186,7 @@ static void format_trailer_info(struct strbuf *out,
 		return;
 	}
 
-	for (i = 0; i < info->trailer_nr; i++) {
+	for (size_t i = 0; i < info->trailer_nr; i++) {
 		char *trailer = info->trailers[i];
 		ssize_t separator_pos = find_separator(trailer, separators);
 
diff --git a/transport-helper.c b/transport-helper.c
index dd6002b393..2e68c0369b 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -299,9 +299,9 @@ static int string_list_set_helper_option(struct helper_data *data,
 					 struct string_list *list)
 {
 	struct strbuf buf = STRBUF_INIT;
-	int i, ret = 0;
+	int ret = 0;
 
-	for (i = 0; i < list->nr; i++) {
+	for (int i = 0; i < list->nr; i++) {
 		strbuf_addf(&buf, "option %s ", name);
 		quote_c_style(list->items[i].string, &buf, NULL, 0);
 		strbuf_addch(&buf, '\n');
@@ -394,10 +394,9 @@ static int fetch_with_fetch(struct transport *transport,
 			    int nr_heads, struct ref **to_fetch)
 {
 	struct helper_data *data = transport->data;
-	int i;
 	struct strbuf buf = STRBUF_INIT;
 
-	for (i = 0; i < nr_heads; i++) {
+	for (int i = 0; i < nr_heads; i++) {
 		const struct ref *posn = to_fetch[i];
 		if (posn->status & REF_STATUS_UPTODATE)
 			continue;
@@ -465,7 +464,6 @@ static int get_exporter(struct transport *transport,
 {
 	struct helper_data *data = transport->data;
 	struct child_process *helper = get_helper(transport);
-	int i;
 
 	child_process_init(fastexport);
 
@@ -481,7 +479,7 @@ static int get_exporter(struct transport *transport,
 	if (data->import_marks)
 		strvec_pushf(&fastexport->args, "--import-marks=%s", data->import_marks);
 
-	for (i = 0; i < revlist_args->nr; i++)
+	for (int i = 0; i < revlist_args->nr; i++)
 		strvec_push(&fastexport->args, revlist_args->items[i].string);
 
 	fastexport->git_cmd = 1;
@@ -686,7 +684,7 @@ static int fetch_refs(struct transport *transport,
 		      int nr_heads, struct ref **to_fetch)
 {
 	struct helper_data *data = transport->data;
-	int i, count;
+	int count;
 
 	get_helper(transport);
 
@@ -707,7 +705,7 @@ static int fetch_refs(struct transport *transport,
 		get_refs_list_using_list(transport, 0);
 
 	count = 0;
-	for (i = 0; i < nr_heads; i++)
+	for (int i = 0; i < nr_heads; i++)
 		if (!(to_fetch[i]->status & REF_STATUS_UPTODATE))
 			count++;
 
@@ -893,7 +891,6 @@ static int push_update_refs_status(struct helper_data *data,
 				    struct ref *remote_refs,
 				    int flags)
 {
-	struct ref *ref;
 	struct ref_push_report *report;
 	struct strbuf buf = STRBUF_INIT;
 	struct push_update_ref_state state = { remote_refs, NULL, 0 };
@@ -913,7 +910,7 @@ static int push_update_refs_status(struct helper_data *data,
 		return 0;
 
 	/* propagate back the update to the remote namespace */
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (struct ref *ref = remote_refs; ref; ref = ref->next) {
 		char *private;
 
 		if (ref->status != REF_STATUS_OK)
@@ -985,7 +982,6 @@ static int push_refs_with_push(struct transport *transport,
 	int atomic = flags & TRANSPORT_PUSH_ATOMIC;
 	struct helper_data *data = transport->data;
 	struct strbuf buf = STRBUF_INIT;
-	struct ref *ref;
 	struct string_list cas_options = STRING_LIST_INIT_DUP;
 	struct string_list_item *cas_option;
 
@@ -993,7 +989,7 @@ static int push_refs_with_push(struct transport *transport,
 	if (!data->push)
 		return 1;
 
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (struct ref *ref = remote_refs; ref; ref = ref->next) {
 		if (!ref->peer_ref && !mirror)
 			continue;
 
@@ -1066,7 +1062,6 @@ static int push_refs_with_push(struct transport *transport,
 static int push_refs_with_export(struct transport *transport,
 		struct ref *remote_refs, int flags)
 {
-	struct ref *ref;
 	struct child_process *helper, exporter;
 	struct helper_data *data = transport->data;
 	struct string_list revlist_args = STRING_LIST_INIT_DUP;
@@ -1085,7 +1080,7 @@ static int push_refs_with_export(struct transport *transport,
 
 	write_constant(helper->in, "export\n");
 
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (struct ref *ref = remote_refs; ref; ref = ref->next) {
 		char *private;
 		struct object_id oid;
 
@@ -1204,7 +1199,6 @@ static struct ref *get_refs_list_using_list(struct transport *transport,
 	struct child_process *helper;
 	struct ref *ret = NULL;
 	struct ref **tail = &ret;
-	struct ref *posn;
 	struct strbuf buf = STRBUF_INIT;
 
 	data->get_refs_list_called = 1;
@@ -1266,7 +1260,7 @@ static struct ref *get_refs_list_using_list(struct transport *transport,
 		fprintf(stderr, "Debug: Read ref listing.\n");
 	strbuf_release(&buf);
 
-	for (posn = ret; posn; posn = posn->next)
+	for (struct ref *posn = ret; posn; posn = posn->next)
 		resolve_remote_symref(posn, ret);
 
 	return ret;
@@ -1629,10 +1623,7 @@ int bidirectional_transfer_loop(int input, int output)
 
 void reject_atomic_push(struct ref *remote_refs, int mirror_mode)
 {
-	struct ref *ref;
-
-	/* Mark other refs as failed */
-	for (ref = remote_refs; ref; ref = ref->next) {
+	for (struct ref *ref = remote_refs; ref; ref = ref->next) {
 		if (!ref->peer_ref && !mirror_mode)
 			continue;
 
diff --git a/transport.c b/transport.c
index df518ead70..878917ae63 100644
--- a/transport.c
+++ b/transport.c
@@ -45,7 +45,6 @@ static int transport_color_config(void)
 		"color.transport.rejected"
 	}, *key = "color.transport";
 	char *value;
-	int i;
 	static int initialized;
 
 	if (initialized)
@@ -58,7 +57,7 @@ static int transport_color_config(void)
 	if (!want_color_stderr(transport_use_color))
 		return 0;
 
-	for (i = 0; i < ARRAY_SIZE(keys); i++)
+	for (int i = 0; i < ARRAY_SIZE(keys); i++)
 		if (!git_config_get_string(keys[i], &value)) {
 			if (!value)
 				return config_error_nonbool(keys[i]);
@@ -79,8 +78,7 @@ static const char *transport_get_color(enum color_transport ix)
 static void set_upstreams(struct transport *transport, struct ref *refs,
 	int pretend)
 {
-	struct ref *ref;
-	for (ref = refs; ref; ref = ref->next) {
+	for (struct ref *ref = refs; ref; ref = ref->next) {
 		const char *localname;
 		const char *tmp;
 		const char *remotename;
@@ -150,14 +148,13 @@ static struct ref *get_refs_from_bundle(struct transport *transport,
 {
 	struct bundle_transport_data *data = transport->data;
 	struct ref *result = NULL;
-	int i;
 
 	if (for_push)
 		return NULL;
 
 	get_refs_from_bundle_inner(transport);
 
-	for (i = 0; i < data->header.references.nr; i++) {
+	for (int i = 0; i < data->header.references.nr; i++) {
 		struct string_list_item *e = data->header.references.items + i;
 		const char *name = e->string;
 		struct ref *ref = alloc_ref(name);
@@ -437,9 +434,8 @@ static int fetch_refs_via_pack(struct transport *transport,
 	args.reject_shallow_remote = transport->smart_options->reject_shallow;
 
 	if (!data->finished_handshake) {
-		int i;
 		int must_list_refs = 0;
-		for (i = 0; i < nr_heads; i++) {
+		for (int i = 0; i < nr_heads; i++) {
 			if (!to_fetch[i]->exact_oid) {
 				must_list_refs = 1;
 				break;
@@ -768,14 +764,13 @@ static int print_one_push_report(struct ref *ref, const char *dest, int count,
 static int print_one_push_status(struct ref *ref, const char *dest, int count,
 				 int porcelain, int summary_width)
 {
-	struct ref_push_report *report;
 	int n = 0;
 
 	if (!ref->report)
 		return print_one_push_report(ref, dest, count,
 					     NULL, porcelain, summary_width);
 
-	for (report = ref->report; report; report = report->next)
+	for (struct ref_push_report *report = ref->report; report; report = report->next)
 		print_one_push_report(ref, dest, count + n++,
 				      report, porcelain, summary_width);
 	return n;
@@ -1242,11 +1237,9 @@ void transport_set_verbosity(struct transport *transport, int verbosity,
 
 static void die_with_unpushed_submodules(struct string_list *needs_pushing)
 {
-	int i;
-
 	fprintf(stderr, _("The following submodule paths contain changes that can\n"
 			"not be found on any remote:\n"));
-	for (i = 0; i < needs_pushing->nr; i++)
+	for (int i = 0; i < needs_pushing->nr; i++)
 		fprintf(stderr, "  %s\n", needs_pushing->items[i].string);
 	fprintf(stderr, _("\nPlease try\n\n"
 			  "	git push --recurse-submodules=on-demand\n\n"
@@ -1263,7 +1256,6 @@ static int run_pre_push_hook(struct transport *transport,
 			     struct ref *remote_refs)
 {
 	int ret = 0, x;
-	struct ref *r;
 	struct child_process proc = CHILD_PROCESS_INIT;
 	struct strbuf buf;
 	const char *hook_path = find_hook("pre-push");
@@ -1287,7 +1279,7 @@ static int run_pre_push_hook(struct transport *transport,
 
 	strbuf_init(&buf, 256);
 
-	for (r = remote_refs; r; r = r->next) {
+	for (struct ref *r = remote_refs; r; r = r->next) {
 		if (!r->peer_ref) continue;
 		if (r->status == REF_STATUS_REJECT_NONFASTFORWARD) continue;
 		if (r->status == REF_STATUS_REJECT_STALE) continue;
@@ -1459,8 +1451,7 @@ int transport_push(struct repository *r,
 
 	if (!(flags & (TRANSPORT_PUSH_DRY_RUN |
 		       TRANSPORT_RECURSE_SUBMODULES_ONLY))) {
-		struct ref *ref;
-		for (ref = remote_refs; ref; ref = ref->next)
+		for (struct ref *ref = remote_refs; ref; ref = ref->next)
 			transport_update_tracking_ref(transport->remote, ref, verbose);
 	}
 
@@ -1562,9 +1553,7 @@ int transport_get_remote_bundle_uri(struct transport *transport)
 void transport_unlock_pack(struct transport *transport, unsigned int flags)
 {
 	int in_signal_handler = !!(flags & TRANSPORT_UNLOCK_PACK_IN_SIGNAL_HANDLER);
-	int i;
-
-	for (i = 0; i < transport->pack_lockfiles.nr; i++)
+	for (int i = 0; i < transport->pack_lockfiles.nr; i++)
 		if (in_signal_handler)
 			unlink(transport->pack_lockfiles.items[i].string);
 		else
diff --git a/tree-diff.c b/tree-diff.c
index 46107772d1..2d73c5383f 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -417,8 +417,7 @@ static void skip_uninteresting(struct tree_desc *t, struct strbuf *base,
 /* ∀ pi=p[imin]  pi↓ */
 static inline void update_tp_entries(struct tree_desc *tp, int nparent)
 {
-	int i;
-	for (i = 0; i < nparent; ++i)
+	for (int i = 0; i < nparent; ++i)
 		if (!(tp[i].entry.mode & S_IFXMIN_NEQ))
 			update_tree_entry(&tp[i]);
 }
diff --git a/tree-walk.c b/tree-walk.c
index b517792ba2..0909a95bce 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -416,9 +416,9 @@ static void update_extended_entry(struct tree_desc_x *t, struct name_entry *a)
 
 static void free_extended_entry(struct tree_desc_x *t)
 {
-	struct tree_desc_skip *p, *s;
+	struct tree_desc_skip *p;
 
-	for (s = t->skip; s; s = p) {
+	for (struct tree_desc_skip *s = t->skip; s; s = p) {
 		p = s->prev;
 		free(s);
 	}
@@ -670,7 +670,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
 	int retval = MISSING_OBJECT;
 	struct dir_state *parents = NULL;
 	size_t parents_alloc = 0;
-	size_t i, parents_nr = 0;
+	size_t parents_nr = 0;
 	struct object_id current_tree_oid;
 	struct strbuf namebuf = STRBUF_INIT;
 	struct tree_desc t;
@@ -835,7 +835,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
 		}
 	}
 done:
-	for (i = 0; i < parents_nr; i++)
+	for (size_t i = 0; i < parents_nr; i++)
 		free(parents[i].tree);
 	free(parents);
 
@@ -1030,7 +1030,6 @@ static enum interesting do_match(struct index_state *istate,
 				 const struct pathspec *ps,
 				 int exclude)
 {
-	int i;
 	int pathlen, baselen = base->len;
 	enum interesting never_interesting = ps->has_wildcard ?
 		entry_not_interesting : all_entries_not_interesting;
@@ -1057,7 +1056,7 @@ static enum interesting do_match(struct index_state *istate,
 
 	pathlen = tree_entry_len(entry);
 
-	for (i = ps->nr - 1; i >= 0; i--) {
+	for (int i = ps->nr - 1; i >= 0; i--) {
 		const struct pathspec_item *item = ps->items+i;
 		const char *match = item->match;
 		const char *base_str = base->buf;
diff --git a/unpack-trees.c b/unpack-trees.c
index c2b20b80d5..dc9fab595a 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -94,8 +94,7 @@ static const char *super_prefixed(const char *path, const char *super_prefix)
 		if (!super_prefix) {
 			super_prefix_len = 0;
 		} else {
-			int i;
-			for (i = 0; i < ARRAY_SIZE(buf); i++)
+			for (int i = 0; i < ARRAY_SIZE(buf); i++)
 				strbuf_addstr(&buf[i], super_prefix);
 			super_prefix_len = buf[0].len;
 		}
@@ -116,7 +115,6 @@ static const char *super_prefixed(const char *path, const char *super_prefix)
 void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
 				  const char *cmd)
 {
-	int i;
 	const char **msgs = opts->internal.msgs;
 	const char *msg;
 
@@ -200,7 +198,7 @@ void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
 
 	opts->internal.show_all_errors = 1;
 	/* rejected paths may not have a static buffer */
-	for (i = 0; i < ARRAY_SIZE(opts->internal.unpack_rejects); i++)
+	for (int i = 0; i < ARRAY_SIZE(opts->internal.unpack_rejects); i++)
 		opts->internal.unpack_rejects[i].strdup_strings = 1;
 }
 
@@ -259,9 +257,8 @@ static int add_rejected_path(struct unpack_trees_options *o,
  */
 static void display_error_msgs(struct unpack_trees_options *o)
 {
-	int e;
 	unsigned error_displayed = 0;
-	for (e = 0; e < NB_UNPACK_TREES_ERROR_TYPES; e++) {
+	for (int e = 0; e < NB_UNPACK_TREES_ERROR_TYPES; e++) {
 		struct string_list *rejects = &o->internal.unpack_rejects[e];
 
 		if (rejects->nr > 0) {
@@ -286,10 +283,8 @@ static void display_error_msgs(struct unpack_trees_options *o)
  */
 static void display_warning_msgs(struct unpack_trees_options *o)
 {
-	int e;
 	unsigned warning_displayed = 0;
-	for (e = NB_UNPACK_TREES_ERROR_TYPES + 1;
-	     e < NB_UNPACK_TREES_WARNING_TYPES; e++) {
+	for (int e = NB_UNPACK_TREES_ERROR_TYPES + 1; e < NB_UNPACK_TREES_WARNING_TYPES; e++) {
 		struct string_list *rejects = &o->internal.unpack_rejects[e];
 
 		if (rejects->nr > 0) {
@@ -374,10 +369,8 @@ static struct progress *get_progress(struct unpack_trees_options *o,
 static void setup_collided_checkout_detection(struct checkout *state,
 					      struct index_state *index)
 {
-	int i;
-
 	state->clone = 1;
-	for (i = 0; i < index->cache_nr; i++)
+	for (int i = 0; i < index->cache_nr; i++)
 		index->cache[i]->ce_flags &= ~CE_MATCHED;
 }
 
@@ -622,8 +615,7 @@ static void mark_ce_used(struct cache_entry *ce, struct unpack_trees_options *o)
 
 static void mark_all_ce_unused(struct index_state *index)
 {
-	int i;
-	for (i = 0; i < index->cache_nr; i++)
+	for (int i = 0; i < index->cache_nr; i++)
 		index->cache[i]->ce_flags &= ~(CE_UNPACKED | CE_ADDED | CE_NEW_SKIP_WORKTREE);
 }
 
@@ -648,9 +640,7 @@ static void mark_ce_used_same_name(struct cache_entry *ce,
 {
 	struct index_state *index = o->src_index;
 	int len = ce_namelen(ce);
-	int pos;
-
-	for (pos = locate_in_src_index(ce, o); pos < index->cache_nr; pos++) {
+	for (int pos = locate_in_src_index(ce, o); pos < index->cache_nr; pos++) {
 		struct cache_entry *next = index->cache[pos];
 		if (len != ce_namelen(next) ||
 		    memcmp(ce->name, next->name, len))
@@ -751,12 +741,11 @@ static int all_trees_same_as_cache_tree(int n, unsigned long dirmask,
 					struct traverse_info *info)
 {
 	struct unpack_trees_options *o = info->data;
-	int i;
 
 	if (!o->merge || dirmask != ((1 << n) - 1))
 		return 0;
 
-	for (i = 1; i < n; i++)
+	for (int i = 1; i < n; i++)
 		if (!are_same_oid(names, names + i))
 			return 0;
 
@@ -801,7 +790,7 @@ static int traverse_by_cache_tree(int pos, int nr_entries, int nr_names,
 	struct unpack_trees_options *o = info->data;
 	struct cache_entry *tree_ce = NULL;
 	int ce_len = 0;
-	int i, d;
+	int d;
 
 	if (!o->merge)
 		BUG("We need cache-tree to do this optimization");
@@ -814,7 +803,7 @@ static int traverse_by_cache_tree(int pos, int nr_entries, int nr_names,
 	 * because cache-tree would be invalidated and we would never
 	 * get here in the first place.
 	 */
-	for (i = 0; i < nr_entries; i++) {
+	for (int i = 0; i < nr_entries; i++) {
 		int new_ce_len, len, rc;
 
 		src[0] = o->src_index->cache[pos + i];
@@ -1270,12 +1259,11 @@ static int unpack_failed(struct unpack_trees_options *o, const char *message)
 static int find_cache_pos(struct traverse_info *info,
 			  const char *p, size_t p_len)
 {
-	int pos;
 	struct unpack_trees_options *o = info->data;
 	struct index_state *index = o->src_index;
 	int pfxlen = info->pathlen;
 
-	for (pos = o->internal.cache_bottom; pos < index->cache_nr; pos++) {
+	for (int pos = o->internal.cache_bottom; pos < index->cache_nr; pos++) {
 		const struct cache_entry *ce = index->cache[pos];
 		const char *ce_name, *ce_slash;
 		int cmp, ce_len;
@@ -1426,12 +1414,11 @@ static void debug_unpack_callback(int n,
 				  struct name_entry *names,
 				  struct traverse_info *info)
 {
-	int i;
 	printf("* unpack mask %lu, dirmask %lu, cnt %d ",
 	       mask, dirmask, n);
 	debug_path(info);
 	putchar('\n');
-	for (i = 0; i < n; i++)
+	for (int i = 0; i < n; i++)
 		debug_name_entry(i, names + i);
 }
 
@@ -1793,13 +1780,7 @@ static void mark_new_skip_worktree(struct pattern_list *pl,
 				   int select_flag, int skip_wt_flag,
 				   int show_progress)
 {
-	int i;
-
-	/*
-	 * 1. Pretend the narrowest worktree: only unmerged entries
-	 * are checked out
-	 */
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct cache_entry *ce = istate->cache[i];
 
 		if (select_flag && !(ce->ce_flags & select_flag))
@@ -2116,7 +2097,6 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o,
 					    struct pattern_list *pl)
 {
 	enum update_sparsity_result ret = UPDATE_SPARSITY_SUCCESS;
-	int i;
 	unsigned old_show_all_errors;
 	int free_pattern_list = 0;
 
@@ -2150,7 +2130,7 @@ enum update_sparsity_result update_sparsity(struct unpack_trees_options *o,
 
 	/* Then loop over entries and update/remove as needed */
 	ret = UPDATE_SPARSITY_SUCCESS;
-	for (i = 0; i < o->src_index->cache_nr; i++) {
+	for (int i = 0; i < o->src_index->cache_nr; i++) {
 		struct cache_entry *ce = o->src_index->cache[i];
 
 
diff --git a/upload-pack.c b/upload-pack.c
index 2537affa90..74f9005a4a 100644
--- a/upload-pack.c
+++ b/upload-pack.c
@@ -476,7 +476,6 @@ static int do_got_oid(struct upload_pack_data *data, const struct object_id *oid
 	if (!o)
 		die("oops (%s)", oid_to_hex(oid));
 	if (o->type == OBJ_COMMIT) {
-		struct commit_list *parents;
 		struct commit *commit = (struct commit *)o;
 		if (o->flags & THEY_HAVE)
 			we_knew_they_have = 1;
@@ -484,9 +483,7 @@ static int do_got_oid(struct upload_pack_data *data, const struct object_id *oid
 			o->flags |= THEY_HAVE;
 		if (!data->oldest_have || (commit->date < data->oldest_have))
 			data->oldest_have = commit->date;
-		for (parents = commit->parents;
-		     parents;
-		     parents = parents->next)
+		for (struct commit_list *parents = commit->parents; parents; parents = parents->next)
 			parents->item->object.flags |= THEY_HAVE;
 	}
 	if (!we_knew_they_have) {
@@ -778,8 +775,6 @@ static int has_unreachable(struct object_array *src, enum allow_uor allow_uor)
 
 static void check_non_tip(struct upload_pack_data *data)
 {
-	int i;
-
 	/*
 	 * In the normal in-process case without
 	 * uploadpack.allowReachableSHA1InWant,
@@ -793,7 +788,7 @@ static void check_non_tip(struct upload_pack_data *data)
 
 error:
 	/* Pick one of them (we know there at least is one) */
-	for (i = 0; i < data->want_obj.nr; i++) {
+	for (int i = 0; i < data->want_obj.nr; i++) {
 		struct object *o = data->want_obj.objects[i].item;
 		if (!is_our_ref(o, data->allow_uor)) {
 			error("git upload-pack: not our ref %s",
@@ -823,9 +818,7 @@ static void send_shallow(struct upload_pack_data *data,
 
 static void send_unshallow(struct upload_pack_data *data)
 {
-	int i;
-
-	for (i = 0; i < data->shallows.nr; i++) {
+	for (int i = 0; i < data->shallows.nr; i++) {
 		struct object *object = data->shallows.objects[i].item;
 		if (object->flags & NOT_SHALLOW) {
 			struct commit_list *parents;
@@ -860,9 +853,7 @@ static int check_ref(const char *refname_full, const struct object_id *oid,
 static void deepen(struct upload_pack_data *data, int depth)
 {
 	if (depth == INFINITE_DEPTH && !is_repository_shallow(the_repository)) {
-		int i;
-
-		for (i = 0; i < data->shallows.nr; i++) {
+		for (int i = 0; i < data->shallows.nr; i++) {
 			struct object *object = data->shallows.objects[i].item;
 			object->flags |= NOT_SHALLOW;
 		}
@@ -943,8 +934,7 @@ static int send_shallow_list(struct upload_pack_data *data)
 		ret = 1;
 	} else {
 		if (data->shallows.nr > 0) {
-			int i;
-			for (i = 0; i < data->shallows.nr; i++)
+			for (int i = 0; i < data->shallows.nr; i++)
 				register_shallow(the_repository,
 						 &data->shallows.objects[i].item->oid);
 		}
@@ -1065,13 +1055,11 @@ static void check_one_filter(struct upload_pack_data *data,
 static void check_filter_recurse(struct upload_pack_data *data,
 				 struct list_objects_filter_options *opts)
 {
-	size_t i;
-
 	check_one_filter(data, opts);
 	if (opts->choice != LOFC_COMBINE)
 		return;
 
-	for (i = 0; i < opts->sub_nr; i++)
+	for (size_t i = 0; i < opts->sub_nr; i++)
 		check_filter_recurse(data, &opts->sub[i]);
 }
 
@@ -1666,10 +1654,7 @@ static void process_args(struct packet_reader *request,
 
 static int process_haves(struct upload_pack_data *data, struct oid_array *common)
 {
-	int i;
-
-	/* Process haves */
-	for (i = 0; i < data->haves.nr; i++) {
+	for (int i = 0; i < data->haves.nr; i++) {
 		const struct object_id *oid = &data->haves.oid[i];
 
 		if (!repo_has_object_file_with_flags(the_repository, oid,
@@ -1686,15 +1671,13 @@ static int process_haves(struct upload_pack_data *data, struct oid_array *common
 
 static int send_acks(struct upload_pack_data *data, struct oid_array *acks)
 {
-	int i;
-
 	packet_writer_write(&data->writer, "acknowledgments\n");
 
 	/* Send Acks */
 	if (!acks->nr)
 		packet_writer_write(&data->writer, "NAK\n");
 
-	for (i = 0; i < acks->nr; i++) {
+	for (int i = 0; i < acks->nr; i++) {
 		packet_writer_write(&data->writer, "ACK %s\n",
 				    oid_to_hex(&acks->oid[i]));
 	}
diff --git a/userdiff.c b/userdiff.c
index 2b1dab2649..c4d4dee259 100644
--- a/userdiff.c
+++ b/userdiff.c
@@ -477,9 +477,8 @@ static int for_each_userdiff_driver_list(each_userdiff_driver_fn fn,
 					 struct userdiff_driver *drv,
 					 int drv_size)
 {
-	int i;
 	int ret;
-	for (i = 0; i < drv_size; i++) {
+	for (int i = 0; i < drv_size; i++) {
 		struct userdiff_driver *item = drv + i;
 		if ((ret = fn(item, type, cb_data)))
 			return ret;
diff --git a/version.c b/version.c
index 41b718c29e..985c825e5d 100644
--- a/version.c
+++ b/version.c
@@ -24,11 +24,10 @@ const char *git_user_agent_sanitized(void)
 
 	if (!agent) {
 		struct strbuf buf = STRBUF_INIT;
-		int i;
 
 		strbuf_addstr(&buf, git_user_agent());
 		strbuf_trim(&buf);
-		for (i = 0; i < buf.len; i++) {
+		for (int i = 0; i < buf.len; i++) {
 			if (buf.buf[i] <= 32 || buf.buf[i] >= 127)
 				buf.buf[i] = '.';
 		}
diff --git a/versioncmp.c b/versioncmp.c
index 45e676cbca..fa93d8577e 100644
--- a/versioncmp.c
+++ b/versioncmp.c
@@ -42,8 +42,7 @@ static void find_better_matching_suffix(const char *tagname, const char *suffix,
 	 * but is longer.
 	 */
 	int end = match->len < suffix_len ? match->start : match->start-1;
-	int i;
-	for (i = start; i <= end; i++)
+	for (int i = start; i <= end; i++)
 		if (starts_with(tagname + i, suffix)) {
 			match->conf_pos = conf_pos;
 			match->start = i;
@@ -75,11 +74,10 @@ static int swap_prereleases(const char *s1,
 			    int off,
 			    int *diff)
 {
-	int i;
 	struct suffix_match match1 = { -1, off, -1 };
 	struct suffix_match match2 = { -1, off, -1 };
 
-	for (i = 0; i < prereleases->nr; i++) {
+	for (int i = 0; i < prereleases->nr; i++) {
 		const char *suffix = prereleases->items[i].string;
 		int start, suffix_len = strlen(suffix);
 		if (suffix_len < off)
diff --git a/walker.c b/walker.c
index 65002a7220..de966a49d5 100644
--- a/walker.c
+++ b/walker.c
@@ -80,8 +80,6 @@ static struct commit_list *complete = NULL;
 
 static int process_commit(struct walker *walker, struct commit *commit)
 {
-	struct commit_list *parents;
-
 	if (repo_parse_commit(the_repository, commit))
 		return -1;
 
@@ -99,7 +97,7 @@ static int process_commit(struct walker *walker, struct commit *commit)
 	if (process(walker, &repo_get_commit_tree(the_repository, commit)->object))
 		return -1;
 
-	for (parents = commit->parents; parents; parents = parents->next) {
+	for (struct commit_list *parents = commit->parents; parents; parents = parents->next) {
 		if (process(walker, &parents->item->object))
 			return -1;
 	}
diff --git a/worktree.c b/worktree.c
index b02a05a74a..fca5b3efd7 100644
--- a/worktree.c
+++ b/worktree.c
@@ -112,9 +112,7 @@ struct worktree *get_linked_worktree(const char *id,
 static void mark_current_worktree(struct worktree **worktrees)
 {
 	char *git_dir = absolute_pathdup(get_git_dir());
-	int i;
-
-	for (i = 0; worktrees[i]; i++) {
+	for (int i = 0; worktrees[i]; i++) {
 		struct worktree *wt = worktrees[i];
 		const char *wt_git_dir = get_worktree_git_dir(wt);
 
@@ -530,12 +528,12 @@ void strbuf_worktree_ref(const struct worktree *wt,
 
 int other_head_refs(each_ref_fn fn, void *cb_data)
 {
-	struct worktree **worktrees, **p;
+	struct worktree **worktrees;
 	struct strbuf refname = STRBUF_INIT;
 	int ret = 0;
 
 	worktrees = get_worktrees();
-	for (p = worktrees; *p; p++) {
+	for (struct worktree **p = worktrees; *p; p++) {
 		struct worktree *wt = *p;
 		struct object_id oid;
 		int flag;
diff --git a/wrapper.c b/wrapper.c
index eeac3741cf..e940a6a132 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -454,7 +454,7 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
 	static const int num_x = ARRAY_SIZE(x_pattern) - 1;
 	char *filename_template;
 	size_t len;
-	int fd, count;
+	int fd;
 
 	len = strlen(pattern);
 
@@ -473,7 +473,7 @@ int git_mkstemps_mode(char *pattern, int suffix_len, int mode)
 	 * Try TMP_MAX different filenames.
 	 */
 	filename_template = &pattern[len - num_x - suffix_len];
-	for (count = 0; count < TMP_MAX; ++count) {
+	for (int count = 0; count < TMP_MAX; ++count) {
 		int i;
 		uint64_t v;
 		if (csprng_bytes(&v, sizeof(v)) < 0)
diff --git a/ws.c b/ws.c
index 9456e2fdbe..f1efe3c9d5 100644
--- a/ws.c
+++ b/ws.c
@@ -88,8 +88,7 @@ unsigned whitespace_rule(struct index_state *istate, const char *pathname)
 	if (ATTR_TRUE(value)) {
 		/* true (whitespace) */
 		unsigned all_rule = ws_tab_width(whitespace_rule_cfg);
-		int i;
-		for (i = 0; i < ARRAY_SIZE(whitespace_rule_names); i++)
+		for (int i = 0; i < ARRAY_SIZE(whitespace_rule_names); i++)
 			if (!whitespace_rule_names[i].loosens_error &&
 			    !whitespace_rule_names[i].exclude_default)
 				all_rule |= whitespace_rule_names[i].rule_bits;
diff --git a/wt-status.c b/wt-status.c
index b5a29083df..e308a3e06e 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -65,7 +65,7 @@ static void status_vprintf(struct wt_status *s, int at_bol, const char *color,
 {
 	struct strbuf sb = STRBUF_INIT;
 	struct strbuf linebuf = STRBUF_INIT;
-	const char *line, *eol;
+	const char *eol;
 
 	strbuf_vaddf(&sb, fmt, ap);
 	if (!sb.len) {
@@ -80,7 +80,7 @@ static void status_vprintf(struct wt_status *s, int at_bol, const char *color,
 		strbuf_release(&sb);
 		return;
 	}
-	for (line = sb.buf; *line; line = eol + 1) {
+	for (const char *line = sb.buf; *line; line = eol + 1) {
 		eol = strchr(line, '\n');
 
 		strbuf_reset(&linebuf);
@@ -163,7 +163,6 @@ void wt_status_prepare(struct repository *r, struct wt_status *s)
 
 static void wt_longstatus_print_unmerged_header(struct wt_status *s)
 {
-	int i;
 	int del_mod_conflict = 0;
 	int both_deleted = 0;
 	int not_deleted = 0;
@@ -171,7 +170,7 @@ static void wt_longstatus_print_unmerged_header(struct wt_status *s)
 
 	status_printf_ln(s, c, _("Unmerged paths:"));
 
-	for (i = 0; i < s->change.nr; i++) {
+	for (int i = 0; i < s->change.nr; i++) {
 		struct string_list_item *it = &(s->change.items[i]);
 		struct wt_status_change_data *d = it->util;
 
@@ -321,9 +320,9 @@ static const char *wt_status_diff_status_string(int status)
 
 static int maxwidth(const char *(*label)(int), int minval, int maxval)
 {
-	int result = 0, i;
+	int result = 0;
 
-	for (i = minval; i <= maxval; i++) {
+	for (int i = minval; i <= maxval; i++) {
 		const char *s = label(i);
 		int len = s ? utf8_strwidth(s) : 0;
 		if (len > result)
@@ -456,12 +455,11 @@ static void wt_status_collect_changed_cb(struct diff_queue_struct *q,
 					 void *data)
 {
 	struct wt_status *s = data;
-	int i;
 
 	if (!q->nr)
 		return;
 	s->workdir_dirty = 1;
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p;
 		struct string_list_item *it;
 		struct wt_status_change_data *d;
@@ -543,9 +541,7 @@ static void wt_status_collect_updated_cb(struct diff_queue_struct *q,
 					 void *data)
 {
 	struct wt_status *s = data;
-	int i;
-
-	for (i = 0; i < q->nr; i++) {
+	for (int i = 0; i < q->nr; i++) {
 		struct diff_filepair *p;
 		struct string_list_item *it;
 		struct wt_status_change_data *d;
@@ -712,9 +708,7 @@ static int add_file_to_list(const struct object_id *oid,
 static void wt_status_collect_changes_initial(struct wt_status *s)
 {
 	struct index_state *istate = s->repo->index;
-	int i;
-
-	for (i = 0; i < istate->cache_nr; i++) {
+	for (int i = 0; i < istate->cache_nr; i++) {
 		struct string_list_item *it;
 		struct wt_status_change_data *d;
 		const struct cache_entry *ce = istate->cache[i];
@@ -815,9 +809,7 @@ static void wt_status_collect_untracked(struct wt_status *s)
 
 static int has_unmerged(struct wt_status *s)
 {
-	int i;
-
-	for (i = 0; i < s->change.nr; i++) {
+	for (int i = 0; i < s->change.nr; i++) {
 		struct wt_status_change_data *d;
 		d = s->change.items[i].util;
 		if (d->stagemask)
@@ -867,9 +859,7 @@ void wt_status_state_free_buffers(struct wt_status_state *state)
 static void wt_longstatus_print_unmerged(struct wt_status *s)
 {
 	int shown_header = 0;
-	int i;
-
-	for (i = 0; i < s->change.nr; i++) {
+	for (int i = 0; i < s->change.nr; i++) {
 		struct wt_status_change_data *d;
 		struct string_list_item *it;
 		it = &(s->change.items[i]);
@@ -890,9 +880,7 @@ static void wt_longstatus_print_unmerged(struct wt_status *s)
 static void wt_longstatus_print_updated(struct wt_status *s)
 {
 	int shown_header = 0;
-	int i;
-
-	for (i = 0; i < s->change.nr; i++) {
+	for (int i = 0; i < s->change.nr; i++) {
 		struct wt_status_change_data *d;
 		struct string_list_item *it;
 		it = &(s->change.items[i]);
@@ -918,12 +906,11 @@ static void wt_longstatus_print_updated(struct wt_status *s)
 static int wt_status_check_worktree_changes(struct wt_status *s,
 					     int *dirty_submodules)
 {
-	int i;
 	int changes = 0;
 
 	*dirty_submodules = 0;
 
-	for (i = 0; i < s->change.nr; i++) {
+	for (int i = 0; i < s->change.nr; i++) {
 		struct wt_status_change_data *d;
 		d = s->change.items[i].util;
 		if (!d->worktree_status ||
@@ -941,7 +928,7 @@ static int wt_status_check_worktree_changes(struct wt_status *s,
 
 static void wt_longstatus_print_changed(struct wt_status *s)
 {
-	int i, dirty_submodules;
+	int dirty_submodules;
 	int worktree_changes = wt_status_check_worktree_changes(s, &dirty_submodules);
 
 	if (!worktree_changes)
@@ -949,7 +936,7 @@ static void wt_longstatus_print_changed(struct wt_status *s)
 
 	wt_longstatus_print_dirty_header(s, worktree_changes < 0, dirty_submodules);
 
-	for (i = 0; i < s->change.nr; i++) {
+	for (int i = 0; i < s->change.nr; i++) {
 		struct wt_status_change_data *d;
 		struct string_list_item *it;
 		it = &(s->change.items[i]);
@@ -1041,7 +1028,6 @@ static void wt_longstatus_print_other(struct wt_status *s,
 				      const char *what,
 				      const char *how)
 {
-	int i;
 	struct strbuf buf = STRBUF_INIT;
 	static struct string_list output = STRING_LIST_INIT_DUP;
 	struct column_options copts;
@@ -1051,7 +1037,7 @@ static void wt_longstatus_print_other(struct wt_status *s,
 
 	wt_longstatus_print_other_header(s, what, how);
 
-	for (i = 0; i < l->nr; i++) {
+	for (int i = 0; i < l->nr; i++) {
 		struct string_list_item *it;
 		const char *path;
 		it = &(l->items[i]);
@@ -1174,7 +1160,7 @@ static void wt_longstatus_print_verbose(struct wt_status *s)
 static void wt_longstatus_print_tracking(struct wt_status *s)
 {
 	struct strbuf sb = STRBUF_INIT;
-	const char *cp, *ep, *branch_name;
+	const char *ep, *branch_name;
 	struct branch *branch;
 	char comment_line_string[3];
 	int i;
@@ -1209,7 +1195,7 @@ static void wt_longstatus_print_tracking(struct wt_status *s)
 	}
 	comment_line_string[i] = '\0';
 
-	for (cp = sb.buf; (ep = strchr(cp, '\n')) != NULL; cp = ep + 1)
+	for (const char *cp = sb.buf; (ep = strchr(cp, '\n')) != NULL; cp = ep + 1)
 		color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s),
 				 "%s%.*s", comment_line_string,
 				 (int)(ep - cp), cp);
@@ -1750,7 +1736,6 @@ static void wt_status_check_sparse_checkout(struct repository *r,
 					    struct wt_status_state *state)
 {
 	int skip_worktree = 0;
-	int i;
 
 	if (!core_apply_sparse_checkout || r->index->cache_nr == 0) {
 		/*
@@ -1766,7 +1751,7 @@ static void wt_status_check_sparse_checkout(struct repository *r,
 		return;
 	}
 
-	for (i = 0; i < r->index->cache_nr; i++) {
+	for (int i = 0; i < r->index->cache_nr; i++) {
 		struct cache_entry *ce = r->index->cache[i];
 		if (ce_skip_worktree(ce))
 			skip_worktree++;
diff --git a/xdiff-interface.c b/xdiff-interface.c
index 3162f51743..9a81750817 100644
--- a/xdiff-interface.c
+++ b/xdiff-interface.c
@@ -53,13 +53,12 @@ static int consume_one(void *priv_, char *s, unsigned long size)
 static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
 {
 	struct xdiff_emit_state *priv = priv_;
-	int i;
 	int stop = 0;
 
 	if (!priv->line_fn)
 		return 0;
 
-	for (i = 0; i < nbuf; i++) {
+	for (int i = 0; i < nbuf; i++) {
 		if (stop)
 			return 1;
 		if (mb[i].ptr[mb[i].size-1] != '\n') {
@@ -282,10 +281,9 @@ void xdiff_set_find_func(xdemitconf_t *xecfg, const char *value, int cflags)
 void xdiff_clear_find_func(xdemitconf_t *xecfg)
 {
 	if (xecfg->find_func) {
-		int i;
 		struct ff_regs *regs = xecfg->find_func_priv;
 
-		for (i = 0; i < regs->nr; i++)
+		for (int i = 0; i < regs->nr; i++)
 			regfree(&regs->array[i].re);
 		free(regs->array);
 		free(regs);
diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
index 344c2dfc3e..4e554f62ce 100644
--- a/xdiff/xdiffi.c
+++ b/xdiff/xdiffi.c
@@ -411,10 +411,9 @@ static int recs_match(xrecord_t *rec1, xrecord_t *rec2)
  */
 static int get_indent(xrecord_t *rec)
 {
-	long i;
 	int ret = 0;
 
-	for (i = 0; i < rec->size; i++) {
+	for (long i = 0; i < rec->size; i++) {
 		char c = rec->ptr[i];
 
 		if (!XDL_ISSPACE(c))
@@ -976,9 +975,9 @@ void xdl_free_script(xdchange_t *xscr) {
 static int xdl_call_hunk_func(xdfenv_t *xe UNUSED, xdchange_t *xscr, xdemitcb_t *ecb,
 			      xdemitconf_t const *xecfg)
 {
-	xdchange_t *xch, *xche;
+	xdchange_t *xche;
 
-	for (xch = xscr; xch; xch = xche->next) {
+	for (xdchange_t *xch = xscr; xch; xch = xche->next) {
 		xche = xdl_get_hunk(&xch, xecfg);
 		if (!xch)
 			break;
@@ -992,9 +991,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe UNUSED, xdchange_t *xscr, xdemitcb_t
 
 static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
 {
-	xdchange_t *xch;
-
-	for (xch = xscr; xch; xch = xch->next) {
+	for (xdchange_t *xch = xscr; xch; xch = xch->next) {
 		int ignore = 1;
 		xrecord_t **rec;
 		long i;
@@ -1013,9 +1010,7 @@ static void xdl_mark_ignorable_lines(xdchange_t *xscr, xdfenv_t *xe, long flags)
 
 static int record_matches_regex(xrecord_t *rec, xpparam_t const *xpp) {
 	regmatch_t regmatch;
-	int i;
-
-	for (i = 0; i < xpp->ignore_regex_nr; i++)
+	for (int i = 0; i < xpp->ignore_regex_nr; i++)
 		if (!regexec_buf(xpp->ignore_regex[i], rec->ptr, rec->size, 1,
 				 &regmatch, 0))
 			return 1;
@@ -1026,9 +1021,7 @@ static int record_matches_regex(xrecord_t *rec, xpparam_t const *xpp) {
 static void xdl_mark_ignorable_regex(xdchange_t *xscr, const xdfenv_t *xe,
 				     xpparam_t const *xpp)
 {
-	xdchange_t *xch;
-
-	for (xch = xscr; xch; xch = xch->next) {
+	for (xdchange_t *xch = xscr; xch; xch = xch->next) {
 		xrecord_t **rec;
 		int ignore = 1;
 		long i;
diff --git a/xdiff/xemit.c b/xdiff/xemit.c
index 75f0fe4986..5611b1b85a 100644
--- a/xdiff/xemit.c
+++ b/xdiff/xemit.c
@@ -135,13 +135,13 @@ struct func_line {
 static long get_func_line(xdfenv_t *xe, xdemitconf_t const *xecfg,
 			  struct func_line *func_line, long start, long limit)
 {
-	long l, size, step = (start > limit) ? -1 : 1;
+	long size, step = (start > limit) ? -1 : 1;
 	char *buf, dummy[1];
 
 	buf = func_line ? func_line->buf : dummy;
 	size = func_line ? sizeof(func_line->buf) : sizeof(dummy);
 
-	for (l = start; l != limit && 0 <= l && l < xe->xdf1.nrec; l += step) {
+	for (long l = start; l != limit && 0 <= l && l < xe->xdf1.nrec; l += step) {
 		long len = match_func_rec(&xe->xdf1, xecfg, l, buf, size);
 		if (len >= 0) {
 			if (func_line)
@@ -167,11 +167,11 @@ static int is_empty_rec(xdfile_t *xdf, long ri)
 int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
 		  xdemitconf_t const *xecfg) {
 	long s1, s2, e1, e2, lctx;
-	xdchange_t *xch, *xche;
+	xdchange_t *xche;
 	long funclineprev = -1;
 	struct func_line func_line = { 0 };
 
-	for (xch = xscr; xch; xch = xche->next) {
+	for (xdchange_t *xch = xscr; xch; xch = xche->next) {
 		xdchange_t *xchp = xch;
 		xche = xdl_get_hunk(&xch, xecfg);
 		if (!xch)
diff --git a/xdiff/xhistogram.c b/xdiff/xhistogram.c
index 16a8fe2f3f..682f97a033 100644
--- a/xdiff/xhistogram.c
+++ b/xdiff/xhistogram.c
@@ -102,11 +102,11 @@ static int cmp_recs(xrecord_t *r1, xrecord_t *r2)
 
 static int scanA(struct histindex *index, int line1, int count1)
 {
-	unsigned int ptr, tbl_idx;
+	unsigned int tbl_idx;
 	unsigned int chain_len;
 	struct record **rec_chain, *rec;
 
-	for (ptr = LINE_END(1); line1 <= ptr; ptr--) {
+	for (unsigned int ptr = LINE_END(1); line1 <= ptr; ptr--) {
 		tbl_idx = TABLE_HASH(index, 1, ptr);
 		rec_chain = index->records + tbl_idx;
 		rec = *rec_chain;
diff --git a/xdiff/xmerge.c b/xdiff/xmerge.c
index af40c88a5b..becac51e3a 100644
--- a/xdiff/xmerge.c
+++ b/xdiff/xmerge.c
@@ -96,11 +96,10 @@ static int xdl_cleanup_merge(xdmerge_t *c)
 static int xdl_merge_cmp_lines(xdfenv_t *xe1, int i1, xdfenv_t *xe2, int i2,
 		int line_count, long flags)
 {
-	int i;
 	xrecord_t **rec1 = xe1->xdf2.recs + i1;
 	xrecord_t **rec2 = xe2->xdf2.recs + i2;
 
-	for (i = 0; i < line_count; i++) {
+	for (int i = 0; i < line_count; i++) {
 		int result = xdl_recmatch(rec1[i]->ptr, rec1[i]->size,
 			rec2[i]->ptr, rec2[i]->size, flags);
 		if (!result)
diff --git a/xdiff/xpatience.c b/xdiff/xpatience.c
index a2d8955537..cf2d432a54 100644
--- a/xdiff/xpatience.c
+++ b/xdiff/xpatience.c
@@ -75,8 +75,7 @@ struct hashmap {
 
 static int is_anchor(xpparam_t const *xpp, const char *line)
 {
-	int i;
-	for (i = 0; i < xpp->anchors_nr; i++) {
+	for (int i = 0; i < xpp->anchors_nr; i++) {
 		if (!strncmp(line, xpp->anchors[i], strlen(xpp->anchors[i])))
 			return 1;
 	}
